Merge pull request #1179 from PokeCodec/Maintenance

Match CheckBagHasSpace
This commit is contained in:
PikalaxALT 2020-09-08 16:31:47 -04:00 committed by GitHub
commit 818bc4ebe5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 110 additions and 271 deletions

View File

@ -176,8 +176,8 @@ typedef struct linkManagerTag
/* 0x024 */ VBL_TIMER nameAcceptTimer; /* 0x024 */ VBL_TIMER nameAcceptTimer;
/* 0x030 */ VBL_TIMER linkRecoveryTimer; /* 0x030 */ VBL_TIMER linkRecoveryTimer;
/* 0x03c */ INIT_PARAM *init_param; /* 0x03c */ INIT_PARAM *init_param;
/* 0x040 */ void (*LMAN_callback)(u8, u8); /* 0x040 */ void (*LMAN_callback)(u8 msg, u8 paramCount);
/* 0x044 */ void (*MSC_callback)(u16); /* 0x044 */ void (*MSC_callback)(u16 REQ_commandID);
} LINK_MANAGER; } LINK_MANAGER;
extern struct linkManagerTag lman; extern struct linkManagerTag lman;

View File

@ -73,8 +73,6 @@ void nullsub_20(void);
void BeginBattleIntro(void); void BeginBattleIntro(void);
void SwitchInClearSetData(void); void SwitchInClearSetData(void);
void FaintClearSetData(void); void FaintClearSetData(void);
void sub_803B3AC(void); // unused
void sub_803B598(void); // unused
void BattleTurnPassed(void); void BattleTurnPassed(void);
u8 IsRunningFromBattleImpossible(void); u8 IsRunningFromBattleImpossible(void);
void SwitchPartyOrder(u8 battlerId); void SwitchPartyOrder(u8 battlerId);

View File

@ -145,7 +145,7 @@
{ \ { \
textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \ textVar[0] = B_BUFF_PLACEHOLDER_BEGIN; \
textVar[1] = B_BUFF_STRING; \ textVar[1] = B_BUFF_STRING; \
textVar[2] = stringId; \ textVar[2] = (stringId & 0xFF); \
textVar[3] = (stringId & 0xFF00) >> 8; \ textVar[3] = (stringId & 0xFF00) >> 8; \
textVar[4] = B_BUFF_EOS; \ textVar[4] = B_BUFF_EOS; \
} }

View File

@ -1299,7 +1299,7 @@ static void Cmd_count_usable_party_mons(void)
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{ {
u32 position; u8 position;
battlerOnField1 = gBattlerPartyIndexes[battlerId]; battlerOnField1 = gBattlerPartyIndexes[battlerId];
position = GetBattlerPosition(battlerId) ^ BIT_FLANK; position = GetBattlerPosition(battlerId) ^ BIT_FLANK;
battlerOnField2 = gBattlerPartyIndexes[GetBattlerAtPosition(position)]; battlerOnField2 = gBattlerPartyIndexes[GetBattlerAtPosition(position)];

View File

@ -655,19 +655,16 @@ static void CB2_InitBattleInternal(void)
gBattle_WIN0V = 0x5051; gBattle_WIN0V = 0x5051;
ScanlineEffect_Clear(); ScanlineEffect_Clear();
i = 0; for (i = 0; i < 80; i++)
while (i < 80)
{ {
gScanlineEffectRegBuffers[0][i] = 0xF0; gScanlineEffectRegBuffers[0][i] = 0xF0;
gScanlineEffectRegBuffers[1][i] = 0xF0; gScanlineEffectRegBuffers[1][i] = 0xF0;
i++;
} }
while (i < 160) for (; i < 160; i++)
{ {
gScanlineEffectRegBuffers[0][i] = 0xFF10; gScanlineEffectRegBuffers[0][i] = 0xFF10;
gScanlineEffectRegBuffers[1][i] = 0xFF10; gScanlineEffectRegBuffers[1][i] = 0xFF10;
i++;
} }
ScanlineEffect_SetParams(sIntroScanlineParams16Bit); ScanlineEffect_SetParams(sIntroScanlineParams16Bit);
@ -794,8 +791,7 @@ static void SetPlayerBerryDataInBattleStruct(void)
static void SetAllPlayersBerryData(void) static void SetAllPlayersBerryData(void)
{ {
s32 i; s32 i, j;
s32 j;
if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)) if (!(gBattleTypeFlags & BATTLE_TYPE_LINK))
{ {
@ -3560,7 +3556,7 @@ static void BattleIntroPrintWildMonAttacked(void)
static void BattleIntroPrintOpponentSendsOut(void) static void BattleIntroPrintOpponentSendsOut(void)
{ {
u32 position; u8 position;
if (gBattleControllerExecFlags) if (gBattleControllerExecFlags)
return; return;
@ -3583,7 +3579,7 @@ static void BattleIntroPrintOpponentSendsOut(void)
static void BattleIntroOpponent2SendsOutMonAnimation(void) static void BattleIntroOpponent2SendsOutMonAnimation(void)
{ {
u32 position; u8 position;
if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED))
position = B_POSITION_OPPONENT_RIGHT; position = B_POSITION_OPPONENT_RIGHT;
@ -3612,19 +3608,24 @@ static void BattleIntroOpponent2SendsOutMonAnimation(void)
#ifdef NONMATCHING #ifdef NONMATCHING
static void BattleIntroOpponent1SendsOutMonAnimation(void) static void BattleIntroOpponent1SendsOutMonAnimation(void)
{ {
u32 position; u8 position;
if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
position = B_POSITION_OPPONENT_LEFT;
else if (gBattleTypeFlags & BATTLE_TYPE_x2000000)
{ {
if (gBattleTypeFlags & BATTLE_TYPE_x80000000) if (gBattleTypeFlags & BATTLE_TYPE_x2000000)
position = B_POSITION_OPPONENT_LEFT; {
if (gBattleTypeFlags & BATTLE_TYPE_x80000000)
position = B_POSITION_OPPONENT_LEFT;
else
position = B_POSITION_PLAYER_LEFT;
}
else else
position = B_POSITION_PLAYER_LEFT; position = B_POSITION_OPPONENT_LEFT;
} }
else else
{
position = B_POSITION_OPPONENT_LEFT; position = B_POSITION_OPPONENT_LEFT;
}
if (gBattleControllerExecFlags) if (gBattleControllerExecFlags)
return; return;
@ -3752,7 +3753,7 @@ static void BattleIntroRecordMonsToDex(void)
} }
} }
void sub_803B3AC(void) // unused static void sub_803B3AC(void) // unused
{ {
if (gBattleControllerExecFlags == 0) if (gBattleControllerExecFlags == 0)
gBattleMainFunc = BattleIntroPrintPlayerSendsOut; gBattleMainFunc = BattleIntroPrintPlayerSendsOut;
@ -3785,7 +3786,7 @@ static void BattleIntroPrintPlayerSendsOut(void)
static void BattleIntroPlayer2SendsOutMonAnimation(void) static void BattleIntroPlayer2SendsOutMonAnimation(void)
{ {
u32 position; u8 position;
if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED))
position = B_POSITION_PLAYER_RIGHT; position = B_POSITION_PLAYER_RIGHT;
@ -3817,7 +3818,7 @@ static void BattleIntroPlayer2SendsOutMonAnimation(void)
static void BattleIntroPlayer1SendsOutMonAnimation(void) static void BattleIntroPlayer1SendsOutMonAnimation(void)
{ {
u32 position; u8 position;
if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED))
position = B_POSITION_PLAYER_LEFT; position = B_POSITION_PLAYER_LEFT;
@ -3855,7 +3856,7 @@ static void BattleIntroPlayer1SendsOutMonAnimation(void)
gBattleMainFunc = TryDoEventsBeforeFirstTurn; gBattleMainFunc = TryDoEventsBeforeFirstTurn;
} }
void sub_803B598(void) // unused static void sub_803B598(void) // unused
{ {
if (gBattleControllerExecFlags == 0) if (gBattleControllerExecFlags == 0)
{ {
@ -3878,8 +3879,7 @@ void sub_803B598(void) // unused
static void TryDoEventsBeforeFirstTurn(void) static void TryDoEventsBeforeFirstTurn(void)
{ {
s32 i; s32 i, j;
s32 j;
u8 effect = 0; u8 effect = 0;
if (gBattleControllerExecFlags) if (gBattleControllerExecFlags)
@ -5103,15 +5103,15 @@ static void HandleEndTurn_RanFromBattle(void)
{ {
switch (gProtectStructs[gBattlerAttacker].fleeFlag) switch (gProtectStructs[gBattlerAttacker].fleeFlag)
{ {
default:
gBattlescriptCurrInstr = BattleScript_GotAwaySafely;
break;
case 1: case 1:
gBattlescriptCurrInstr = BattleScript_SmokeBallEscape; gBattlescriptCurrInstr = BattleScript_SmokeBallEscape;
break; break;
case 2: case 2:
gBattlescriptCurrInstr = BattleScript_RanAwayUsingMonAbility; gBattlescriptCurrInstr = BattleScript_RanAwayUsingMonAbility;
break; break;
default:
gBattlescriptCurrInstr = BattleScript_GotAwaySafely;
break;
} }
} }
@ -5195,10 +5195,7 @@ static void FreeResetData_ReturnToOvOrDoEvolutions(void)
gBattleMainFunc = ReturnFromBattleToOverworld; gBattleMainFunc = ReturnFromBattleToOverworld;
return; return;
} }
else gBattleMainFunc = TryEvolvePokemon;
{
gBattleMainFunc = TryEvolvePokemon;
}
} }
FreeAllWindowBuffers(); FreeAllWindowBuffers();
@ -5534,7 +5531,9 @@ static void HandleAction_UseItem(void)
gBattlerAttacker = gBattlerTarget = gBattlerByTurnOrder[gCurrentTurnActionNumber]; gBattlerAttacker = gBattlerTarget = gBattlerByTurnOrder[gCurrentTurnActionNumber];
gBattle_BG0_X = 0; gBattle_BG0_X = 0;
gBattle_BG0_Y = 0; gBattle_BG0_Y = 0;
ClearFuryCutterDestinyBondGrudge(gBattlerAttacker); ClearFuryCutterDestinyBondGrudge(gBattlerAttacker);
gLastUsedItem = gBattleBufferB[gBattlerAttacker][1] | (gBattleBufferB[gBattlerAttacker][2] << 8); gLastUsedItem = gBattleBufferB[gBattlerAttacker][1] | (gBattleBufferB[gBattlerAttacker][2] << 8);
if (gLastUsedItem <= LAST_BALL) // is ball if (gLastUsedItem <= LAST_BALL) // is ball
@ -5560,18 +5559,18 @@ static void HandleAction_UseItem(void)
break; break;
case AI_ITEM_CURE_CONDITION: case AI_ITEM_CURE_CONDITION:
gBattleCommunication[MULTISTRING_CHOOSER] = 0; 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; gBattleCommunication[MULTISTRING_CHOOSER] = 5;
} }
else else
{ {
while (!(*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) & 1)) do
{ {
*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) >>= 1; *(gBattleStruct->AI_itemFlags + (gBattlerAttacker >> 1)) >>= 1;
gBattleCommunication[MULTISTRING_CHOOSER]++; gBattleCommunication[MULTISTRING_CHOOSER]++;
} } while (!(*(gBattleStruct->AI_itemFlags + (gBattlerAttacker >> 1)) & 1));
} }
break; break;
case AI_ITEM_X_STAT: case AI_ITEM_X_STAT:
@ -5587,7 +5586,7 @@ static void HandleAction_UseItem(void)
while (!((*(gBattleStruct->AI_itemFlags + (gBattlerAttacker >> 1))) & 1)) while (!((*(gBattleStruct->AI_itemFlags + (gBattlerAttacker >> 1))) & 1))
{ {
*(gBattleStruct->AI_itemFlags + gBattlerAttacker / 2) >>= 1; *(gBattleStruct->AI_itemFlags + (gBattlerAttacker >> 1)) >>= 1;
gBattleTextBuff1[2]++; gBattleTextBuff1[2]++;
} }
@ -5603,7 +5602,7 @@ static void HandleAction_UseItem(void)
break; break;
} }
gBattlescriptCurrInstr = gBattlescriptsForUsingItem[*(gBattleStruct->AI_itemType + gBattlerAttacker / 2)]; gBattlescriptCurrInstr = gBattlescriptsForUsingItem[*(gBattleStruct->AI_itemType + (gBattlerAttacker >> 1))];
} }
gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT; gCurrentActionFuncId = B_ACTION_EXEC_SCRIPT;
} }

View File

@ -8835,20 +8835,18 @@ u8 (*const gMovementActionFuncs_FlyDown[])(struct ObjectEvent *, struct Sprite *
u8 MovementAction_StoreAndLockAnim_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite) u8 MovementAction_StoreAndLockAnim_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{ {
u32 one; bool8 ableToStore = FALSE;
bool32 ableToStore = FALSE;
if (gLockedAnimObjectEvents == NULL) if (gLockedAnimObjectEvents == NULL)
{ {
gLockedAnimObjectEvents = AllocZeroed(sizeof(struct LockedAnimObjectEvents)); gLockedAnimObjectEvents = AllocZeroed(sizeof(struct LockedAnimObjectEvents));
gLockedAnimObjectEvents->objectEventIds[0] = objectEvent->localId; gLockedAnimObjectEvents->objectEventIds[0] = objectEvent->localId;
// needed to match gLockedAnimObjectEvents->count = 1;
gLockedAnimObjectEvents->count = (one = 1); ableToStore = TRUE;
ableToStore = one;
} }
else else
{ {
u8 i, firstFreeSlot; u8 i, firstFreeSlot;
bool32 found; bool8 found;
for (firstFreeSlot = 16, found = FALSE, i = 0; i < 16; i++) for (firstFreeSlot = 16, found = FALSE, i = 0; i < 16; i++)
{ {
if (firstFreeSlot == 16 && gLockedAnimObjectEvents->objectEventIds[i] == 0) 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) u8 MovementAction_FreeAndUnlockAnim_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite)
{ {
bool32 ableToStore; bool8 ableToStore;
u8 index; u8 index;
sprite->data[2] = 1; sprite->data[2] = 1;

View File

@ -181,40 +181,36 @@ u32 GetMewMoveDirection(void)
{ {
if (ShouldMewMoveEast(mew, 1)) if (ShouldMewMoveEast(mew, 1))
return GetRandomMewDirectionCandidate(2); return GetRandomMewDirectionCandidate(2);
else if (ShouldMewMoveWest(mew, 1)) if (ShouldMewMoveWest(mew, 1))
return GetRandomMewDirectionCandidate(2); return GetRandomMewDirectionCandidate(2);
else return DIR_NORTH;
return DIR_NORTH;
} }
if (ShouldMewMoveSouth(mew, 0)) if (ShouldMewMoveSouth(mew, 0))
{ {
if (ShouldMewMoveEast(mew, 1)) if (ShouldMewMoveEast(mew, 1))
return GetRandomMewDirectionCandidate(2); return GetRandomMewDirectionCandidate(2);
else if (ShouldMewMoveWest(mew, 1)) if (ShouldMewMoveWest(mew, 1))
return GetRandomMewDirectionCandidate(2); return GetRandomMewDirectionCandidate(2);
else return DIR_SOUTH;
return DIR_SOUTH;
} }
if (ShouldMewMoveEast(mew, 0)) if (ShouldMewMoveEast(mew, 0))
{ {
if (ShouldMewMoveNorth(mew, 1)) if (ShouldMewMoveNorth(mew, 1))
return GetRandomMewDirectionCandidate(2); return GetRandomMewDirectionCandidate(2);
else if (ShouldMewMoveSouth(mew, 1)) if (ShouldMewMoveSouth(mew, 1))
return GetRandomMewDirectionCandidate(2); return GetRandomMewDirectionCandidate(2);
else return DIR_EAST;
return DIR_EAST;
} }
if (ShouldMewMoveWest(mew, 0)) if (ShouldMewMoveWest(mew, 0))
{ {
if (ShouldMewMoveNorth(mew, 1)) if (ShouldMewMoveNorth(mew, 1))
return GetRandomMewDirectionCandidate(2); return GetRandomMewDirectionCandidate(2);
else if (ShouldMewMoveSouth(mew, 1)) if (ShouldMewMoveSouth(mew, 1))
return GetRandomMewDirectionCandidate(2); return GetRandomMewDirectionCandidate(2);
else return DIR_WEST;
return DIR_WEST;
} }
// If this point is reached, Mew cannot move without getting closer to the player // 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) if (count > 1)
return sMewDirectionCandidates[VarGet(VAR_FARAWAY_ISLAND_STEP_COUNTER) % count]; return sMewDirectionCandidates[VarGet(VAR_FARAWAY_ISLAND_STEP_COUNTER) % count];
else return sMewDirectionCandidates[0];
return sMewDirectionCandidates[0];
} }
void UpdateFarawayIslandStepCounter(void) void UpdateFarawayIslandStepCounter(void)

View File

@ -181,222 +181,67 @@ bool8 HasAtLeastOneBerry(void)
return FALSE; return FALSE;
} }
#ifdef NONMATCHING
// Refuses to match.
bool8 CheckBagHasSpace(u16 itemId, u16 count) bool8 CheckBagHasSpace(u16 itemId, u16 count)
{ {
u8 i; u8 i, pocket;
u16 slotCapacity, ownedCount;
if (ItemId_GetPocket(itemId) == POCKET_NONE) if (ItemId_GetPocket(itemId) == POCKET_NONE)
return FALSE; 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); return CheckPyramidBagHasSpace(itemId, count);
} }
pocket = ItemId_GetPocket(itemId) - 1;
if (pocket != BERRIES_POCKET)
slotCapacity = MAX_BAG_ITEM_CAPACITY;
else 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; if (gBagPockets[pocket].itemSlots[i].itemId == itemId)
u16 slotCapacity; {
u16 ownedCount; 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; // Check space in empty item slots
if (pocket != BERRIES_POCKET) if (count > 0) //if (count !=0) also works here; both match
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++) 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 (count > slotCapacity)
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)
return TRUE;
if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET) if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET)
return FALSE; return FALSE;
count -= slotCapacity; 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
} }
if (count > 0) //if (count !=0) also works here; both match
return TRUE; 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) bool8 AddBagItem(u16 itemId, u16 count)
{ {

View File

@ -1392,10 +1392,10 @@ _081DD9F6:
bl ChnVolSetAsm bl ChnVolSetAsm
cmp r6, 0 cmp r6, 0
beq _081DDA14 beq _081DDA14
ldrb r0, [r4, o_CgbChannel_mo] ldrb r0, [r4, #o_CgbChannel_mo]
movs r1, 0x1 movs r1, 0x1
orrs r0, r1 orrs r0, r1
strb r0, [r4, o_CgbChannel_mo] strb r0, [r4, #o_CgbChannel_mo]
_081DDA14: _081DDA14:
ldrb r3, [r5, #o_MusicPlayerTrack_flags] ldrb r3, [r5, #o_MusicPlayerTrack_flags]
movs r0, 0xC movs r0, 0xC
@ -1416,11 +1416,11 @@ _081DDA28:
ldrb r2, [r5, #o_MusicPlayerTrack_pitM] ldrb r2, [r5, #o_MusicPlayerTrack_pitM]
adds r0, r6, 0 adds r0, r6, 0
bl call_r3 bl call_r3
str r0, [r4, o_CgbChannel_fr] str r0, [r4, #o_CgbChannel_fr]
ldrb r0, [r4, o_CgbChannel_mo] ldrb r0, [r4, #o_CgbChannel_mo]
movs r1, 0x2 movs r1, 0x2
orrs r0, r1 orrs r0, r1
strb r0, [r4, o_CgbChannel_mo] strb r0, [r4, #o_CgbChannel_mo]
b _081DDA52 b _081DDA52
_081DDA46: _081DDA46:
adds r1, r2, 0 adds r1, r2, 0

View File

@ -83,7 +83,7 @@ const u8 gScaleTable[] =
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
}; };
const u32 gFreqTable[] = const u32 gFreqTable[12] =
{ {
2147483648u, 2147483648u,
2275179671u, 2275179671u,
@ -99,7 +99,7 @@ const u32 gFreqTable[] =
4053909305u, 4053909305u,
}; };
const u16 gPcmSamplesPerVBlankTable[] = const u16 gPcmSamplesPerVBlankTable[12] =
{ {
96, 96,
132, 132,
@ -130,7 +130,7 @@ const u8 gCgbScaleTable[] =
0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB,
}; };
const s16 gCgbFreqTable[] = const s16 gCgbFreqTable[12] =
{ {
-2004, -2004,
-1891, -1891,

View File

@ -5746,25 +5746,29 @@ u8 GetTrainerEncounterMusicId(u16 trainerOpponentId)
u16 ModifyStatByNature(u8 nature, u16 n, u8 statIndex) u16 ModifyStatByNature(u8 nature, u16 n, u8 statIndex)
{ {
u16 retVal;
// Dont modify HP, Accuracy, or Evasion by nature // Dont modify HP, Accuracy, or Evasion by nature
if (statIndex <= STAT_HP || statIndex > NUM_NATURE_STATS) if (statIndex <= STAT_HP || statIndex > NUM_NATURE_STATS)
{ {
// Should just be "return n", but it wouldn't match without this. return n;
u16 retVal = n;
retVal++;
retVal--;
return retVal;
} }
switch (gNatureStatTable[nature][statIndex - 1]) switch (gNatureStatTable[nature][statIndex - 1])
{ {
case 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: 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 \ #define IS_LEAGUE_BATTLE \