diff --git a/include/AgbRfu_LinkManager.h b/include/AgbRfu_LinkManager.h index d4ef13183..4e1a879c2 100644 --- a/include/AgbRfu_LinkManager.h +++ b/include/AgbRfu_LinkManager.h @@ -176,8 +176,8 @@ typedef struct linkManagerTag /* 0x024 */ VBL_TIMER nameAcceptTimer; /* 0x030 */ VBL_TIMER linkRecoveryTimer; /* 0x03c */ INIT_PARAM *init_param; - /* 0x040 */ void (*LMAN_callback)(u8, u8); - /* 0x044 */ void (*MSC_callback)(u16); + /* 0x040 */ void (*LMAN_callback)(u8 msg, u8 paramCount); + /* 0x044 */ void (*MSC_callback)(u16 REQ_commandID); } LINK_MANAGER; extern struct linkManagerTag lman; diff --git a/include/battle_main.h b/include/battle_main.h index 890e47f39..9e3dc7cd6 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -73,8 +73,6 @@ void nullsub_20(void); void BeginBattleIntro(void); void SwitchInClearSetData(void); void FaintClearSetData(void); -void sub_803B3AC(void); // unused -void sub_803B598(void); // unused void BattleTurnPassed(void); u8 IsRunningFromBattleImpossible(void); void SwitchPartyOrder(u8 battlerId); diff --git a/include/battle_message.h b/include/battle_message.h index 011a1cb0c..af090a06c 100644 --- a/include/battle_message.h +++ b/include/battle_message.h @@ -145,7 +145,7 @@ { \ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \ textVar[1] = B_BUFF_STRING; \ - textVar[2] = stringId; \ + textVar[2] = (stringId & 0xFF); \ textVar[3] = (stringId & 0xFF00) >> 8; \ textVar[4] = B_BUFF_EOS; \ } diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 748e4729a..032e5f407 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -1299,7 +1299,7 @@ static void Cmd_count_usable_party_mons(void) if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { - u32 position; + u8 position; battlerOnField1 = gBattlerPartyIndexes[battlerId]; position = GetBattlerPosition(battlerId) ^ BIT_FLANK; battlerOnField2 = gBattlerPartyIndexes[GetBattlerAtPosition(position)]; diff --git a/src/battle_main.c b/src/battle_main.c index 193fffaf2..e2b3714fc 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -655,19 +655,16 @@ static void CB2_InitBattleInternal(void) gBattle_WIN0V = 0x5051; ScanlineEffect_Clear(); - i = 0; - while (i < 80) + for (i = 0; i < 80; i++) { gScanlineEffectRegBuffers[0][i] = 0xF0; gScanlineEffectRegBuffers[1][i] = 0xF0; - i++; } - while (i < 160) + for (; i < 160; i++) { gScanlineEffectRegBuffers[0][i] = 0xFF10; gScanlineEffectRegBuffers[1][i] = 0xFF10; - i++; } ScanlineEffect_SetParams(sIntroScanlineParams16Bit); @@ -794,8 +791,7 @@ static void SetPlayerBerryDataInBattleStruct(void) static void SetAllPlayersBerryData(void) { - s32 i; - s32 j; + s32 i, j; if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)) { @@ -3560,7 +3556,7 @@ static void BattleIntroPrintWildMonAttacked(void) static void BattleIntroPrintOpponentSendsOut(void) { - u32 position; + u8 position; if (gBattleControllerExecFlags) return; @@ -3583,7 +3579,7 @@ static void BattleIntroPrintOpponentSendsOut(void) static void BattleIntroOpponent2SendsOutMonAnimation(void) { - u32 position; + u8 position; if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) position = B_POSITION_OPPONENT_RIGHT; @@ -3612,19 +3608,24 @@ static void BattleIntroOpponent2SendsOutMonAnimation(void) #ifdef NONMATCHING static void BattleIntroOpponent1SendsOutMonAnimation(void) { - u32 position; + u8 position; - if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) - position = B_POSITION_OPPONENT_LEFT; - else if (gBattleTypeFlags & BATTLE_TYPE_x2000000) + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) { - if (gBattleTypeFlags & BATTLE_TYPE_x80000000) - position = B_POSITION_OPPONENT_LEFT; + if (gBattleTypeFlags & BATTLE_TYPE_x2000000) + { + if (gBattleTypeFlags & BATTLE_TYPE_x80000000) + position = B_POSITION_OPPONENT_LEFT; + else + position = B_POSITION_PLAYER_LEFT; + } else - position = B_POSITION_PLAYER_LEFT; + position = B_POSITION_OPPONENT_LEFT; } else + { position = B_POSITION_OPPONENT_LEFT; + } if (gBattleControllerExecFlags) return; @@ -3752,7 +3753,7 @@ static void BattleIntroRecordMonsToDex(void) } } -void sub_803B3AC(void) // unused +static void sub_803B3AC(void) // unused { if (gBattleControllerExecFlags == 0) gBattleMainFunc = BattleIntroPrintPlayerSendsOut; @@ -3785,7 +3786,7 @@ static void BattleIntroPrintPlayerSendsOut(void) static void BattleIntroPlayer2SendsOutMonAnimation(void) { - u32 position; + u8 position; if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) position = B_POSITION_PLAYER_RIGHT; @@ -3817,7 +3818,7 @@ static void BattleIntroPlayer2SendsOutMonAnimation(void) static void BattleIntroPlayer1SendsOutMonAnimation(void) { - u32 position; + u8 position; if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) position = B_POSITION_PLAYER_LEFT; @@ -3855,7 +3856,7 @@ static void BattleIntroPlayer1SendsOutMonAnimation(void) gBattleMainFunc = TryDoEventsBeforeFirstTurn; } -void sub_803B598(void) // unused +static void sub_803B598(void) // unused { if (gBattleControllerExecFlags == 0) { @@ -3878,8 +3879,7 @@ void sub_803B598(void) // unused static void TryDoEventsBeforeFirstTurn(void) { - s32 i; - s32 j; + s32 i, j; u8 effect = 0; if (gBattleControllerExecFlags) @@ -5103,15 +5103,15 @@ static void HandleEndTurn_RanFromBattle(void) { switch (gProtectStructs[gBattlerAttacker].fleeFlag) { - default: - gBattlescriptCurrInstr = BattleScript_GotAwaySafely; - break; case 1: gBattlescriptCurrInstr = BattleScript_SmokeBallEscape; break; case 2: gBattlescriptCurrInstr = BattleScript_RanAwayUsingMonAbility; break; + default: + gBattlescriptCurrInstr = BattleScript_GotAwaySafely; + break; } } @@ -5195,10 +5195,7 @@ static void FreeResetData_ReturnToOvOrDoEvolutions(void) gBattleMainFunc = ReturnFromBattleToOverworld; return; } - else - { - gBattleMainFunc = TryEvolvePokemon; - } + gBattleMainFunc = TryEvolvePokemon; } FreeAllWindowBuffers(); @@ -5534,7 +5531,9 @@ static void HandleAction_UseItem(void) gBattlerAttacker = gBattlerTarget = gBattlerByTurnOrder[gCurrentTurnActionNumber]; gBattle_BG0_X = 0; gBattle_BG0_Y = 0; + ClearFuryCutterDestinyBondGrudge(gBattlerAttacker); + gLastUsedItem = gBattleBufferB[gBattlerAttacker][1] | (gBattleBufferB[gBattlerAttacker][2] << 8); if (gLastUsedItem <= LAST_BALL) // is ball @@ -5560,18 +5559,18 @@ static void HandleAction_UseItem(void) break; case AI_ITEM_CURE_CONDITION: gBattleCommunication[MULTISTRING_CHOOSER] = 0; - if (*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) & 1) + if (*(gBattleStruct->AI_itemFlags + (gBattlerAttacker >> 1)) & 1) { - if (*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) & 0x3E) + if (*(gBattleStruct->AI_itemFlags + (gBattlerAttacker >> 1)) & 0x3E) gBattleCommunication[MULTISTRING_CHOOSER] = 5; } else { - while (!(*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) & 1)) + do { - *(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) >>= 1; + *(gBattleStruct->AI_itemFlags + (gBattlerAttacker >> 1)) >>= 1; gBattleCommunication[MULTISTRING_CHOOSER]++; - } + } while (!(*(gBattleStruct->AI_itemFlags + (gBattlerAttacker >> 1)) & 1)); } break; case AI_ITEM_X_STAT: @@ -5587,7 +5586,7 @@ static void HandleAction_UseItem(void) while (!((*(gBattleStruct->AI_itemFlags + (gBattlerAttacker >> 1))) & 1)) { - *(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) >>= 1; + *(gBattleStruct->AI_itemFlags + (gBattlerAttacker >> 1)) >>= 1; gBattleTextBuff1[2]++; } @@ -5603,7 +5602,7 @@ static void HandleAction_UseItem(void) break; } - gBattlescriptCurrInstr = gBattlescriptsForUsingItem[*(gBattleStruct->AI_itemType + gBattlerAttacker / 2)]; + gBattlescriptCurrInstr = gBattlescriptsForUsingItem[*(gBattleStruct->AI_itemType + (gBattlerAttacker >> 1))]; } gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; } diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 72de880c8..68f873446 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -8835,20 +8835,18 @@ u8 (*const gMovementActionFuncs_FlyDown[])(struct ObjectEvent *, struct Sprite * u8 MovementAction_StoreAndLockAnim_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - u32 one; - bool32 ableToStore = FALSE; + bool8 ableToStore = FALSE; if (gLockedAnimObjectEvents == NULL) { gLockedAnimObjectEvents = AllocZeroed(sizeof(struct LockedAnimObjectEvents)); gLockedAnimObjectEvents->objectEventIds[0] = objectEvent->localId; - // needed to match - gLockedAnimObjectEvents->count = (one = 1); - ableToStore = one; + gLockedAnimObjectEvents->count = 1; + ableToStore = TRUE; } else { u8 i, firstFreeSlot; - bool32 found; + bool8 found; for (firstFreeSlot = 16, found = FALSE, i = 0; i < 16; i++) { if (firstFreeSlot == 16 && gLockedAnimObjectEvents->objectEventIds[i] == 0) @@ -8881,7 +8879,7 @@ u8 MovementAction_StoreAndLockAnim_Step0(struct ObjectEvent *objectEvent, struct u8 MovementAction_FreeAndUnlockAnim_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) { - bool32 ableToStore; + bool8 ableToStore; u8 index; sprite->data[2] = 1; diff --git a/src/faraway_island.c b/src/faraway_island.c index e3d8444c9..6bfa066c2 100755 --- a/src/faraway_island.c +++ b/src/faraway_island.c @@ -181,40 +181,36 @@ u32 GetMewMoveDirection(void) { if (ShouldMewMoveEast(mew, 1)) return GetRandomMewDirectionCandidate(2); - else if (ShouldMewMoveWest(mew, 1)) + if (ShouldMewMoveWest(mew, 1)) return GetRandomMewDirectionCandidate(2); - else - return DIR_NORTH; + return DIR_NORTH; } if (ShouldMewMoveSouth(mew, 0)) { if (ShouldMewMoveEast(mew, 1)) return GetRandomMewDirectionCandidate(2); - else if (ShouldMewMoveWest(mew, 1)) + if (ShouldMewMoveWest(mew, 1)) return GetRandomMewDirectionCandidate(2); - else - return DIR_SOUTH; + return DIR_SOUTH; } if (ShouldMewMoveEast(mew, 0)) { if (ShouldMewMoveNorth(mew, 1)) return GetRandomMewDirectionCandidate(2); - else if (ShouldMewMoveSouth(mew, 1)) + if (ShouldMewMoveSouth(mew, 1)) return GetRandomMewDirectionCandidate(2); - else - return DIR_EAST; + return DIR_EAST; } if (ShouldMewMoveWest(mew, 0)) { if (ShouldMewMoveNorth(mew, 1)) return GetRandomMewDirectionCandidate(2); - else if (ShouldMewMoveSouth(mew, 1)) + if (ShouldMewMoveSouth(mew, 1)) return GetRandomMewDirectionCandidate(2); - else - return DIR_WEST; + return DIR_WEST; } // If this point is reached, Mew cannot move without getting closer to the player @@ -315,8 +311,7 @@ static u8 GetValidMewMoveDirection(u8 ignoredDir) if (count > 1) return sMewDirectionCandidates[VarGet(VAR_FARAWAY_ISLAND_STEP_COUNTER) % count]; - else - return sMewDirectionCandidates[0]; + return sMewDirectionCandidates[0]; } void UpdateFarawayIslandStepCounter(void) diff --git a/src/item.c b/src/item.c index 5a77d363e..290e7177c 100644 --- a/src/item.c +++ b/src/item.c @@ -181,222 +181,67 @@ bool8 HasAtLeastOneBerry(void) return FALSE; } -#ifdef NONMATCHING -// Refuses to match. bool8 CheckBagHasSpace(u16 itemId, u16 count) { - u8 i; + u8 i, pocket; + u16 slotCapacity, ownedCount; if (ItemId_GetPocket(itemId) == POCKET_NONE) return FALSE; - if (InBattlePyramid() || FlagGet(FLAG_STORING_ITEMS_IN_PYRAMID_BAG) == TRUE) + if (InBattlePyramid() || (FlagGet(FLAG_STORING_ITEMS_IN_PYRAMID_BAG) == TRUE)) { return CheckPyramidBagHasSpace(itemId, count); } + + pocket = ItemId_GetPocket(itemId) - 1; + if (pocket != BERRIES_POCKET) + slotCapacity = MAX_BAG_ITEM_CAPACITY; else + slotCapacity = MAX_BERRY_CAPACITY; + + // Check space in any existing item slots that already contain this item + for (i = 0; i < gBagPockets[pocket].capacity; i++) { - u8 pocket; - u16 slotCapacity; - u16 ownedCount; + if (gBagPockets[pocket].itemSlots[i].itemId == itemId) + { + ownedCount = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity); + if (ownedCount + count <= slotCapacity) + return TRUE; + if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET) + return FALSE; + count -= (slotCapacity - ownedCount); + if (count == 0) + break; //Should just be "return TRUE", since setting count to 0 means all the remaining checks until return will be false anyway, but that doesn't match + } + } - pocket = ItemId_GetPocket(itemId) - 1; - if (pocket != BERRIES_POCKET) - slotCapacity = MAX_BAG_ITEM_CAPACITY; - else - slotCapacity = MAX_BERRY_CAPACITY; - - // Check space in any existing item slots that already contain this item + // Check space in empty item slots + if (count > 0) //if (count !=0) also works here; both match + { for (i = 0; i < gBagPockets[pocket].capacity; i++) { - if (gBagPockets[pocket].itemSlots[i].itemId == itemId) + if (gBagPockets[pocket].itemSlots[i].itemId == 0) { - ownedCount = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity); - if (ownedCount + count <= slotCapacity) - return TRUE; - if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET) - return FALSE; - count -= slotCapacity - ownedCount; - 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) { - if (count <= slotCapacity) - return TRUE; if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET) return FALSE; count -= slotCapacity; } + else + { + count = 0; //Should just be "return TRUE", since setting count to 0 means all the remaining checks until return will be false anyway, but that doesn't match + break; + } } - if (count > 0) - return FALSE; // No more item slots. The bag is full } - - return TRUE; + if (count > 0) //if (count !=0) also works here; both match + return FALSE; // No more item slots. The bag is full } + + return TRUE; } -#else -NAKED -bool8 CheckBagHasSpace(u16 itemId, u16 count) -{ - asm_unified( - "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, 16\n\ - lsrs r0, 16\n\ - mov r8, r0\n\ - lsls r1, 16\n\ - lsrs r5, r1, 16\n\ - bl ItemId_GetPocket\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _080D6906\n\ - bl InBattlePyramid\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _080D6838\n\ - ldr r0, =0x00004004\n\ - bl FlagGet\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bne _080D684C\n\ -_080D6838:\n\ - mov r0, r8\n\ - adds r1, r5, 0\n\ - bl CheckPyramidBagHasSpace\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - b _080D6916\n\ - .pool\n\ -_080D684C:\n\ - mov r0, r8\n\ - bl ItemId_GetPocket\n\ - subs r0, 0x1\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ - ldr r7, =0x000003e7\n\ - cmp r2, 0x3\n\ - beq _080D6860\n\ - movs r7, 0x63\n\ -_080D6860:\n\ - movs r6, 0\n\ - ldr r1, =gBagPockets\n\ - lsls r4, r2, 3\n\ - adds r0, r4, r1\n\ - mov r9, r4\n\ - ldrb r0, [r0, 0x4]\n\ - cmp r6, r0\n\ - bcs _080D68BC\n\ - subs r0, r2, 0x2\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - mov r10, r0\n\ -_080D6878:\n\ - adds r0, r4, r1\n\ - ldr r1, [r0]\n\ - lsls r0, r6, 2\n\ - adds r1, r0, r1\n\ - ldrh r0, [r1]\n\ - cmp r0, r8\n\ - bne _080D68AC\n\ - adds r0, r1, 0x2\n\ - str r2, [sp]\n\ - bl GetBagItemQuantity\n\ - lsls r0, 16\n\ - lsrs r1, r0, 16\n\ - adds r0, r1, r5\n\ - ldr r2, [sp]\n\ - cmp r0, r7\n\ - ble _080D6914\n\ - mov r0, r10\n\ - cmp r0, 0x1\n\ - bls _080D6906\n\ - subs r0, r7, r1\n\ - subs r0, r5, r0\n\ - lsls r0, 16\n\ - lsrs r5, r0, 16\n\ - cmp r5, 0\n\ - beq _080D6914\n\ -_080D68AC:\n\ - adds r0, r6, 0x1\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - ldr r1, =gBagPockets\n\ - adds r0, r4, r1\n\ - ldrb r0, [r0, 0x4]\n\ - cmp r6, r0\n\ - bcc _080D6878\n\ -_080D68BC:\n\ - cmp r5, 0\n\ - beq _080D6914\n\ - movs r6, 0\n\ - ldr r3, =gBagPockets\n\ - mov r1, r9\n\ - adds r0, r1, r3\n\ - ldrb r0, [r0, 0x4]\n\ - cmp r6, r0\n\ - bcs _080D6902\n\ - adds r4, r3, 0\n\ - subs r0, r2, 0x2\n\ - lsls r0, 24\n\ - lsrs r2, r0, 24\n\ -_080D68D6:\n\ - adds r0, r1, r4\n\ - ldr r1, [r0]\n\ - lsls r0, r6, 2\n\ - adds r0, r1\n\ - ldrh r0, [r0]\n\ - cmp r0, 0\n\ - bne _080D68F2\n\ - cmp r5, r7\n\ - bls _080D6914\n\ - cmp r2, 0x1\n\ - bls _080D6906\n\ - subs r0, r5, r7\n\ - lsls r0, 16\n\ - lsrs r5, r0, 16\n\ -_080D68F2:\n\ - adds r0, r6, 0x1\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - mov r1, r9\n\ - adds r0, r1, r3\n\ - ldrb r0, [r0, 0x4]\n\ - cmp r6, r0\n\ - bcc _080D68D6\n\ -_080D6902:\n\ - cmp r5, 0\n\ - beq _080D6914\n\ -_080D6906:\n\ - movs r0, 0\n\ - b _080D6916\n\ - .pool\n\ -_080D6914:\n\ - movs r0, 0x1\n\ -_080D6916:\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"); -} -#endif // NONMATCHING bool8 AddBagItem(u16 itemId, u16 count) { diff --git a/src/m4a_1.s b/src/m4a_1.s index eace09b05..290404ad0 100644 --- a/src/m4a_1.s +++ b/src/m4a_1.s @@ -1392,10 +1392,10 @@ _081DD9F6: bl ChnVolSetAsm cmp r6, 0 beq _081DDA14 - ldrb r0, [r4, o_CgbChannel_mo] + ldrb r0, [r4, #o_CgbChannel_mo] movs r1, 0x1 orrs r0, r1 - strb r0, [r4, o_CgbChannel_mo] + strb r0, [r4, #o_CgbChannel_mo] _081DDA14: ldrb r3, [r5, #o_MusicPlayerTrack_flags] movs r0, 0xC @@ -1416,11 +1416,11 @@ _081DDA28: ldrb r2, [r5, #o_MusicPlayerTrack_pitM] adds r0, r6, 0 bl call_r3 - str r0, [r4, o_CgbChannel_fr] - ldrb r0, [r4, o_CgbChannel_mo] + str r0, [r4, #o_CgbChannel_fr] + ldrb r0, [r4, #o_CgbChannel_mo] movs r1, 0x2 orrs r0, r1 - strb r0, [r4, o_CgbChannel_mo] + strb r0, [r4, #o_CgbChannel_mo] b _081DDA52 _081DDA46: adds r1, r2, 0 diff --git a/src/m4a_tables.c b/src/m4a_tables.c index 9a4ea32e6..dfd285b1f 100644 --- a/src/m4a_tables.c +++ b/src/m4a_tables.c @@ -83,7 +83,7 @@ const u8 gScaleTable[] = 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, }; -const u32 gFreqTable[] = +const u32 gFreqTable[12] = { 2147483648u, 2275179671u, @@ -99,7 +99,7 @@ const u32 gFreqTable[] = 4053909305u, }; -const u16 gPcmSamplesPerVBlankTable[] = +const u16 gPcmSamplesPerVBlankTable[12] = { 96, 132, @@ -130,7 +130,7 @@ const u8 gCgbScaleTable[] = 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, }; -const s16 gCgbFreqTable[] = +const s16 gCgbFreqTable[12] = { -2004, -1891, diff --git a/src/pokemon.c b/src/pokemon.c index 188624d6a..2440f183e 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -5746,25 +5746,29 @@ u8 GetTrainerEncounterMusicId(u16 trainerOpponentId) u16 ModifyStatByNature(u8 nature, u16 n, u8 statIndex) { + u16 retVal; // Dont modify HP, Accuracy, or Evasion by nature if (statIndex <= STAT_HP || statIndex > NUM_NATURE_STATS) { - // Should just be "return n", but it wouldn't match without this. - u16 retVal = n; - retVal++; - retVal--; - return retVal; + return n; } switch (gNatureStatTable[nature][statIndex - 1]) { case 1: - return (u16)(n * 110) / 100; // NOTE: will overflow for n > 595 because the intermediate value is cast to u16 before the division. Fix by removing (u16) cast + retVal = n * 110; + retVal /= 100; + break; case -1: - return (u16)(n * 90) / 100; // NOTE: will overflow for n > 728, see above + retVal = n * 90; + retVal /= 100; + break; + default: + retVal = n; + break; } - return n; + return retVal; } #define IS_LEAGUE_BATTLE \