Merge pull request #1179 from PokeCodec/Maintenance
Match CheckBagHasSpace
This commit is contained in:
commit
818bc4ebe5
11 changed files with 110 additions and 271 deletions
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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; \
|
||||
}
|
||||
|
|
|
@ -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)];
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
229
src/item.c
229
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)
|
||||
{
|
||||
|
|
10
src/m4a_1.s
10
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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 \
|
||||
|
|
Loading…
Reference in a new issue