Merge branch 'master' into link

This commit is contained in:
PikalaxALT
2018-02-11 19:22:06 -05:00
429 changed files with 56348 additions and 62508 deletions
+151 -169
View File
@@ -2,6 +2,7 @@
#include "battle_ai_script_commands.h"
#include "pokemon.h"
#include "battle.h"
#include "battle_setup.h"
#include "constants/species.h"
#include "constants/abilities.h"
#include "random.h"
@@ -44,26 +45,7 @@ in order to read the next command correctly. refer to battle_ai_scripts.s for th
AI scripts.
*/
extern u32 gBattleTypeFlags;
extern u8 gActiveBank;
extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT];
extern u16 gCurrentMove;
extern u8 gBankTarget;
extern u8 gAbsentBankFlags;
extern u16 gLastMoves[BATTLE_BANKS_COUNT];
extern u16 gTrainerBattleOpponent_A;
extern u16 gTrainerBattleOpponent_B;
extern u32 gStatuses3[BATTLE_BANKS_COUNT];
extern u16 gSideAffecting[2];
extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
extern u16 gDynamicBasePower;
extern u8 gBattleMoveFlags;
extern s32 gBattleMoveDamage;
extern u8 gCritMultiplier;
extern u16 gBattleWeather;
extern const struct BattleMove gBattleMoves[];
extern const struct BaseStats gBaseStats[];
extern const u8 * const gBattleAI_ScriptsTable[];
extern u32 GetAiScriptsInRecordedBattle();
@@ -179,7 +161,7 @@ static void BattleAICmd_if_holds_item(void);
// ewram
EWRAM_DATA const u8 *gAIScriptPtr = NULL;
EWRAM_DATA static u8 sBank_AI = 0;
EWRAM_DATA static u8 sBattler_AI = 0;
// const rom data
@@ -352,7 +334,7 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves)
defaultScoreMoves >>= 1;
}
moveLimitations = CheckMoveLimitations(gActiveBank, 0, 0xFF);
moveLimitations = CheckMoveLimitations(gActiveBattler, 0, 0xFF);
// ignore moves that aren't possible to use
for (i = 0; i < 4; i++)
@@ -363,18 +345,18 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves)
AI_THINKING_STRUCT->simulatedRNG[i] = 100 - (Random() % 16);
}
gBattleResources->AI_ScriptsStack->size = 0;
sBank_AI = gActiveBank;
sBattler_AI = gActiveBattler;
// decide a random target bank in doubles
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
gBankTarget = (Random() & BIT_MON) + (GetBankSide(gActiveBank) ^ BIT_SIDE);
if (gAbsentBankFlags & gBitTable[gBankTarget])
gBankTarget ^= BIT_MON;
gBattlerTarget = (Random() & BIT_FLANK) + (GetBattlerSide(gActiveBattler) ^ BIT_SIDE);
if (gAbsentBattlerFlags & gBitTable[gBattlerTarget])
gBattlerTarget ^= BIT_FLANK;
}
// in singles there's only one choice
else
{
gBankTarget = sBank_AI ^ BIT_SIDE;
gBattlerTarget = sBattler_AI ^ BIT_SIDE;
}
if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
@@ -444,7 +426,7 @@ static u8 BattleAI_ChooseMoveOrAction_Singles(void)
for (i = 1; i < 4; i++)
{
if (gBattleMons[sBank_AI].moves[i] != 0) // emerald adds an extra move ID check for some reason.
if (gBattleMons[sBattler_AI].moves[i] != 0) // emerald adds an extra move ID check for some reason.
{
// in ruby, the order of these if statements are reversed.
if (currentMoveArray[0] == AI_THINKING_STRUCT->score[i])
@@ -479,7 +461,7 @@ static u8 BattleAI_ChooseMoveOrAction_Doubles(void)
for (i = 0; i < 4; i++)
{
if (i == sBank_AI || gBattleMons[i].hp == 0)
if (i == sBattler_AI || gBattleMons[i].hp == 0)
{
actionOrMoveIndex[i] = -1;
bestMovePointsForTarget[i] = -1;
@@ -491,9 +473,9 @@ static u8 BattleAI_ChooseMoveOrAction_Doubles(void)
else
BattleAI_SetupAIData(0xF);
gBankTarget = i;
gBattlerTarget = i;
if ((i & BIT_SIDE) != (sBank_AI & BIT_SIDE))
if ((i & BIT_SIDE) != (sBattler_AI & BIT_SIDE))
RecordLastUsedMoveByTarget();
AI_THINKING_STRUCT->aiLogicId = 0;
@@ -521,7 +503,7 @@ static u8 BattleAI_ChooseMoveOrAction_Doubles(void)
mostViableMovesNo = 1;
for (j = 1; j < 4; j++)
{
if (gBattleMons[sBank_AI].moves[j] != 0)
if (gBattleMons[sBattler_AI].moves[j] != 0)
{
if (mostViableMovesScores[0] == AI_THINKING_STRUCT->score[j])
{
@@ -542,7 +524,7 @@ static u8 BattleAI_ChooseMoveOrAction_Doubles(void)
bestMovePointsForTarget[i] = mostViableMovesScores[0];
// don't use a move against ally if it has less than 100 pts
if (i == (sBank_AI ^ BIT_MON) && bestMovePointsForTarget[i] < 100)
if (i == (sBattler_AI ^ BIT_FLANK) && bestMovePointsForTarget[i] < 100)
{
bestMovePointsForTarget[i] = -1;
mostViableMovesScores[0] = mostViableMovesScores[0]; // needed to match
@@ -573,8 +555,8 @@ static u8 BattleAI_ChooseMoveOrAction_Doubles(void)
}
}
gBankTarget = mostViableTargetsArray[Random() % mostViableTargetsNo];
return actionOrMoveIndex[gBankTarget];
gBattlerTarget = mostViableTargetsArray[Random() % mostViableTargetsNo];
return actionOrMoveIndex[gBattlerTarget];
}
static void BattleAI_DoAIProcessing(void)
@@ -587,13 +569,13 @@ static void BattleAI_DoAIProcessing(void)
break;
case AIState_SettingUp:
gAIScriptPtr = gBattleAI_ScriptsTable[AI_THINKING_STRUCT->aiLogicId]; // set AI ptr to logic ID.
if (gBattleMons[sBank_AI].pp[AI_THINKING_STRUCT->movesetIndex] == 0)
if (gBattleMons[sBattler_AI].pp[AI_THINKING_STRUCT->movesetIndex] == 0)
{
AI_THINKING_STRUCT->moveConsidered = 0;
}
else
{
AI_THINKING_STRUCT->moveConsidered = gBattleMons[sBank_AI].moves[AI_THINKING_STRUCT->movesetIndex];
AI_THINKING_STRUCT->moveConsidered = gBattleMons[sBattler_AI].moves[AI_THINKING_STRUCT->movesetIndex];
}
AI_THINKING_STRUCT->aiState++;
break;
@@ -627,18 +609,18 @@ static void RecordLastUsedMoveByTarget(void)
for (i = 0; i < 4; i++)
{
if (gBattleResources->battleHistory->usedMoves[gBankTarget].moves[i] == gLastMoves[gBankTarget])
if (gBattleResources->battleHistory->usedMoves[gBattlerTarget].moves[i] == gLastMoves[gBattlerTarget])
break;
if (gBattleResources->battleHistory->usedMoves[gBankTarget].moves[i] != gLastMoves[gBankTarget] // HACK: This redundant condition is a hack to make the asm match.
&& gBattleResources->battleHistory->usedMoves[gBankTarget].moves[i] == 0)
if (gBattleResources->battleHistory->usedMoves[gBattlerTarget].moves[i] != gLastMoves[gBattlerTarget] // HACK: This redundant condition is a hack to make the asm match.
&& gBattleResources->battleHistory->usedMoves[gBattlerTarget].moves[i] == 0)
{
gBattleResources->battleHistory->usedMoves[gBankTarget].moves[i] = gLastMoves[gBankTarget];
gBattleResources->battleHistory->usedMoves[gBattlerTarget].moves[i] = gLastMoves[gBattlerTarget];
break;
}
}
}
void ClearBankMoveHistory(u8 bank)
void ClearBattlerMoveHistory(u8 bank)
{
s32 i;
@@ -651,7 +633,7 @@ void RecordAbilityBattle(u8 bank, u8 abilityId)
gBattleResources->battleHistory->abilities[bank] = abilityId;
}
void ClearBankAbilityHistory(u8 bank)
void ClearBattlerAbilityHistory(u8 bank)
{
gBattleResources->battleHistory->abilities[bank] = 0;
}
@@ -721,9 +703,9 @@ static void BattleAICmd_if_hp_less_than(void)
u16 bank;
if (gAIScriptPtr[1] == AI_USER)
bank = sBank_AI;
bank = sBattler_AI;
else
bank = gBankTarget;
bank = gBattlerTarget;
if ((u32)(100 * gBattleMons[bank].hp / gBattleMons[bank].maxHP) < gAIScriptPtr[2])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
@@ -736,9 +718,9 @@ static void BattleAICmd_if_hp_more_than(void)
u16 bank;
if (gAIScriptPtr[1] == AI_USER)
bank = sBank_AI;
bank = sBattler_AI;
else
bank = gBankTarget;
bank = gBattlerTarget;
if ((u32)(100 * gBattleMons[bank].hp / gBattleMons[bank].maxHP) > gAIScriptPtr[2])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
@@ -751,9 +733,9 @@ static void BattleAICmd_if_hp_equal(void)
u16 bank;
if (gAIScriptPtr[1] == AI_USER)
bank = sBank_AI;
bank = sBattler_AI;
else
bank = gBankTarget;
bank = gBattlerTarget;
if ((u32)(100 * gBattleMons[bank].hp / gBattleMons[bank].maxHP) == gAIScriptPtr[2])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
@@ -766,9 +748,9 @@ static void BattleAICmd_if_hp_not_equal(void)
u16 bank;
if (gAIScriptPtr[1] == AI_USER)
bank = sBank_AI;
bank = sBattler_AI;
else
bank = gBankTarget;
bank = gBattlerTarget;
if ((u32)(100 * gBattleMons[bank].hp / gBattleMons[bank].maxHP) != gAIScriptPtr[2])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
@@ -782,9 +764,9 @@ static void BattleAICmd_if_status(void)
u32 status;
if (gAIScriptPtr[1] == AI_USER)
bank = sBank_AI;
bank = sBattler_AI;
else
bank = gBankTarget;
bank = gBattlerTarget;
status = AIScriptRead32(gAIScriptPtr + 2);
@@ -800,9 +782,9 @@ static void BattleAICmd_if_not_status(void)
u32 status;
if (gAIScriptPtr[1] == AI_USER)
bank = sBank_AI;
bank = sBattler_AI;
else
bank = gBankTarget;
bank = gBattlerTarget;
status = AIScriptRead32(gAIScriptPtr + 2);
@@ -818,9 +800,9 @@ static void BattleAICmd_if_status2(void)
u32 status;
if (gAIScriptPtr[1] == AI_USER)
bank = sBank_AI;
bank = sBattler_AI;
else
bank = gBankTarget;
bank = gBattlerTarget;
status = AIScriptRead32(gAIScriptPtr + 2);
@@ -836,9 +818,9 @@ static void BattleAICmd_if_not_status2(void)
u32 status;
if (gAIScriptPtr[1] == AI_USER)
bank = sBank_AI;
bank = sBattler_AI;
else
bank = gBankTarget;
bank = gBattlerTarget;
status = AIScriptRead32(gAIScriptPtr + 2);
@@ -854,9 +836,9 @@ static void BattleAICmd_if_status3(void)
u32 status;
if (gAIScriptPtr[1] == AI_USER)
bank = sBank_AI;
bank = sBattler_AI;
else
bank = gBankTarget;
bank = gBattlerTarget;
status = AIScriptRead32(gAIScriptPtr + 2);
@@ -872,9 +854,9 @@ static void BattleAICmd_if_not_status3(void)
u32 status;
if (gAIScriptPtr[1] == AI_USER)
bank = sBank_AI;
bank = sBattler_AI;
else
bank = gBankTarget;
bank = gBattlerTarget;
status = AIScriptRead32(gAIScriptPtr + 2);
@@ -890,14 +872,14 @@ static void BattleAICmd_if_side_affecting(void)
u32 side, status;
if (gAIScriptPtr[1] == AI_USER)
bank = sBank_AI;
bank = sBattler_AI;
else
bank = gBankTarget;
bank = gBattlerTarget;
side = GET_BANK_SIDE(bank);
side = GET_BATTLER_SIDE(bank);
status = AIScriptRead32(gAIScriptPtr + 2);
if ((gSideAffecting[side] & status) != 0)
if ((gSideStatuses[side] & status) != 0)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
else
gAIScriptPtr += 10;
@@ -909,14 +891,14 @@ static void BattleAICmd_if_not_side_affecting(void)
u32 side, status;
if (gAIScriptPtr[1] == AI_USER)
bank = sBank_AI;
bank = sBattler_AI;
else
bank = gBankTarget;
bank = gBattlerTarget;
side = GET_BANK_SIDE(bank);
side = GET_BATTLER_SIDE(bank);
status = AIScriptRead32(gAIScriptPtr + 2);
if ((gSideAffecting[side] & status) == 0)
if ((gSideStatuses[side] & status) == 0)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
else
gAIScriptPtr += 10;
@@ -1084,8 +1066,8 @@ static void BattleAICmd_if_user_has_attacking_move(void)
for (i = 0; i < 4; i++)
{
if (gBattleMons[sBank_AI].moves[i] != 0
&& gBattleMoves[gBattleMons[sBank_AI].moves[i]].power != 0)
if (gBattleMons[sBattler_AI].moves[i] != 0
&& gBattleMoves[gBattleMons[sBattler_AI].moves[i]].power != 0)
break;
}
if (i == 4)
@@ -1100,8 +1082,8 @@ static void BattleAICmd_if_user_has_no_attacking_moves(void)
for (i = 0; i < 4; i++)
{
if (gBattleMons[sBank_AI].moves[i] != 0
&& gBattleMoves[gBattleMons[sBank_AI].moves[i]].power != 0)
if (gBattleMons[sBattler_AI].moves[i] != 0
&& gBattleMoves[gBattleMons[sBattler_AI].moves[i]].power != 0)
break;
}
if (i != 4)
@@ -1123,16 +1105,16 @@ static void BattleAICmd_get_type(void)
switch (typeVar)
{
case AI_TYPE1_USER: // AI user primary type
AI_THINKING_STRUCT->funcResult = gBattleMons[sBank_AI].type1;
AI_THINKING_STRUCT->funcResult = gBattleMons[sBattler_AI].type1;
break;
case AI_TYPE1_TARGET: // target primary type
AI_THINKING_STRUCT->funcResult = gBattleMons[gBankTarget].type1;
AI_THINKING_STRUCT->funcResult = gBattleMons[gBattlerTarget].type1;
break;
case AI_TYPE2_USER: // AI user secondary type
AI_THINKING_STRUCT->funcResult = gBattleMons[sBank_AI].type2;
AI_THINKING_STRUCT->funcResult = gBattleMons[sBattler_AI].type2;
break;
case AI_TYPE2_TARGET: // target secondary type
AI_THINKING_STRUCT->funcResult = gBattleMons[gBankTarget].type2;
AI_THINKING_STRUCT->funcResult = gBattleMons[gBattlerTarget].type2;
break;
case AI_TYPE_MOVE: // type of move being pointed to
AI_THINKING_STRUCT->funcResult = gBattleMoves[AI_THINKING_STRUCT->moveConsidered].type;
@@ -1146,14 +1128,14 @@ static u8 BattleAI_GetWantedBank(u8 bank)
switch (bank)
{
case AI_USER:
return sBank_AI;
return sBattler_AI;
case AI_TARGET:
default:
return gBankTarget;
return gBattlerTarget;
case AI_USER_PARTNER:
return sBank_AI ^ BIT_MON;
return sBattler_AI ^ BIT_FLANK;
case AI_TARGET_PARTNER:
return gBankTarget ^ BIT_MON;
return gBattlerTarget ^ BIT_FLANK;
}
}
@@ -1196,24 +1178,24 @@ static void BattleAICmd_get_how_powerful_move_is(void)
gDynamicBasePower = 0;
*(&gBattleStruct->dynamicMoveType) = 0;
gBattleScripting.dmgMultiplier = 1;
gBattleMoveFlags = 0;
gMoveResultFlags = 0;
gCritMultiplier = 1;
for (checkedMove = 0; checkedMove < 4; checkedMove++)
{
for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++)
{
if (gBattleMoves[gBattleMons[sBank_AI].moves[checkedMove]].effect == sDiscouragedPowerfulMoveEffects[i])
if (gBattleMoves[gBattleMons[sBattler_AI].moves[checkedMove]].effect == sDiscouragedPowerfulMoveEffects[i])
break;
}
if (gBattleMons[sBank_AI].moves[checkedMove] != MOVE_NONE
if (gBattleMons[sBattler_AI].moves[checkedMove] != MOVE_NONE
&& sDiscouragedPowerfulMoveEffects[i] == 0xFFFF
&& gBattleMoves[gBattleMons[sBank_AI].moves[checkedMove]].power > 1)
&& gBattleMoves[gBattleMons[sBattler_AI].moves[checkedMove]].power > 1)
{
gCurrentMove = gBattleMons[sBank_AI].moves[checkedMove];
AI_CalcDmg(sBank_AI, gBankTarget);
TypeCalc(gCurrentMove, sBank_AI, gBankTarget);
gCurrentMove = gBattleMons[sBattler_AI].moves[checkedMove];
AI_CalcDmg(sBattler_AI, gBattlerTarget);
TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget);
moveDmgs[checkedMove] = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[checkedMove] / 100;
if (moveDmgs[checkedMove] == 0)
moveDmgs[checkedMove] = 1;
@@ -1246,9 +1228,9 @@ static void BattleAICmd_get_how_powerful_move_is(void)
static void BattleAICmd_get_last_used_bank_move(void)
{
if (gAIScriptPtr[1] == AI_USER)
AI_THINKING_STRUCT->funcResult = gLastMoves[sBank_AI];
AI_THINKING_STRUCT->funcResult = gLastMoves[sBattler_AI];
else
AI_THINKING_STRUCT->funcResult = gLastMoves[gBankTarget];
AI_THINKING_STRUCT->funcResult = gLastMoves[gBattlerTarget];
gAIScriptPtr += 2;
}
@@ -1271,7 +1253,7 @@ static void BattleAICmd_if_not_equal_(void) // same as if_not_equal
static void BattleAICmd_if_user_goes(void)
{
if (GetWhoStrikesFirst(sBank_AI, gBankTarget, TRUE) == gAIScriptPtr[1])
if (GetWhoStrikesFirst(sBattler_AI, gBattlerTarget, TRUE) == gAIScriptPtr[1])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
@@ -1279,7 +1261,7 @@ static void BattleAICmd_if_user_goes(void)
static void BattleAICmd_if_user_doesnt_go(void)
{
if (GetWhoStrikesFirst(sBank_AI, gBankTarget, TRUE) != gAIScriptPtr[1])
if (GetWhoStrikesFirst(sBattler_AI, gBattlerTarget, TRUE) != gAIScriptPtr[1])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;
@@ -1303,26 +1285,26 @@ static void BattleAICmd_count_usable_party_mons(void)
AI_THINKING_STRUCT->funcResult = 0;
if (gAIScriptPtr[1] == AI_USER)
bank = sBank_AI;
bank = sBattler_AI;
else
bank = gBankTarget;
bank = gBattlerTarget;
if (GetBankSide(bank) == SIDE_PLAYER)
if (GetBattlerSide(bank) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
u32 identity;
bankOnField1 = gBattlePartyID[bank];
identity = GetBankIdentity(bank) ^ BIT_MON;
bankOnField2 = gBattlePartyID[GetBankByIdentity(identity)];
u32 position;
bankOnField1 = gBattlerPartyIndexes[bank];
position = GetBattlerPosition(bank) ^ BIT_FLANK;
bankOnField2 = gBattlerPartyIndexes[GetBattlerAtPosition(position)];
}
else // in singles there's only one bank by side
{
bankOnField1 = gBattlePartyID[bank];
bankOnField2 = gBattlePartyID[bank];
bankOnField1 = gBattlerPartyIndexes[bank];
bankOnField2 = gBattlerPartyIndexes[bank];
}
for (i = 0; i < PARTY_SIZE; i++)
@@ -1356,11 +1338,11 @@ static void BattleAICmd_get_ability(void)
u8 bank;
if (gAIScriptPtr[1] == AI_USER)
bank = sBank_AI;
bank = sBattler_AI;
else
bank = gBankTarget;
bank = gBattlerTarget;
if (gActiveBank != bank)
if (gActiveBattler != bank)
{
if (BATTLE_HISTORY->abilities[bank] != 0)
{
@@ -1482,18 +1464,18 @@ static void BattleAICmd_get_highest_type_effectiveness(void)
dynamicMoveType = &gBattleStruct->dynamicMoveType;
*dynamicMoveType = 0;
gBattleScripting.dmgMultiplier = 1;
gBattleMoveFlags = 0;
gMoveResultFlags = 0;
gCritMultiplier = 1;
AI_THINKING_STRUCT->funcResult = 0;
for (i = 0; i < 4; i++)
{
gBattleMoveDamage = AI_EFFECTIVENESS_x1;
gCurrentMove = gBattleMons[sBank_AI].moves[i];
gCurrentMove = gBattleMons[sBattler_AI].moves[i];
if (gCurrentMove)
{
TypeCalc(gCurrentMove, sBank_AI, gBankTarget);
TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget);
// reduce by 1/3.
if (gBattleMoveDamage == 120)
@@ -1505,7 +1487,7 @@ static void BattleAICmd_get_highest_type_effectiveness(void)
if (gBattleMoveDamage == 15)
gBattleMoveDamage = AI_EFFECTIVENESS_x0_25;
if (gBattleMoveFlags & MOVESTATUS_NOTAFFECTED)
if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE)
gBattleMoveDamage = AI_EFFECTIVENESS_x0;
if (AI_THINKING_STRUCT->funcResult < gBattleMoveDamage)
@@ -1522,13 +1504,13 @@ static void BattleAICmd_if_type_effectiveness(void)
gDynamicBasePower = 0;
gBattleStruct->dynamicMoveType = 0;
gBattleScripting.dmgMultiplier = 1;
gBattleMoveFlags = 0;
gMoveResultFlags = 0;
gCritMultiplier = 1;
gBattleMoveDamage = AI_EFFECTIVENESS_x1;
gCurrentMove = AI_THINKING_STRUCT->moveConsidered;
TypeCalc(gCurrentMove, sBank_AI, gBankTarget);
TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget);
if (gBattleMoveDamage == 120)
gBattleMoveDamage = AI_EFFECTIVENESS_x2;
@@ -1539,7 +1521,7 @@ static void BattleAICmd_if_type_effectiveness(void)
if (gBattleMoveDamage == 15)
gBattleMoveDamage = AI_EFFECTIVENESS_x0_25;
if (gBattleMoveFlags & MOVESTATUS_NOTAFFECTED)
if (gMoveResultFlags & MOVE_RESULT_DOESNT_AFFECT_FOE)
gBattleMoveDamage = AI_EFFECTIVENESS_x0;
// store gBattleMoveDamage in a u8 variable because gAIScriptPtr[1] is a u8.
@@ -1569,14 +1551,14 @@ static void BattleAICmd_if_status_in_party(void)
switch(gAIScriptPtr[1])
{
case AI_USER:
bank = sBank_AI;
bank = sBattler_AI;
break;
default:
bank = gBankTarget;
bank = gBattlerTarget;
break;
}
party = (GetBankSide(bank) == SIDE_PLAYER) ? gPlayerParty : gEnemyParty;
party = (GetBattlerSide(bank) == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty;
statusToCompareTo = AIScriptRead32(gAIScriptPtr + 2);
@@ -1606,14 +1588,14 @@ static void BattleAICmd_if_status_not_in_party(void)
switch(gAIScriptPtr[1])
{
case 1:
bank = sBank_AI;
bank = sBattler_AI;
break;
default:
bank = gBankTarget;
bank = gBattlerTarget;
break;
}
party = (GetBankSide(bank) == SIDE_PLAYER) ? gPlayerParty : gEnemyParty;
party = (GetBattlerSide(bank) == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty;
statusToCompareTo = AIScriptRead32(gAIScriptPtr + 2);
@@ -1667,9 +1649,9 @@ static void BattleAICmd_if_stat_level_less_than(void)
u32 bank;
if (gAIScriptPtr[1] == AI_USER)
bank = sBank_AI;
bank = sBattler_AI;
else
bank = gBankTarget;
bank = gBattlerTarget;
if (gBattleMons[bank].statStages[gAIScriptPtr[2]] < gAIScriptPtr[3])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
@@ -1682,9 +1664,9 @@ static void BattleAICmd_if_stat_level_more_than(void)
u32 bank;
if (gAIScriptPtr[1] == AI_USER)
bank = sBank_AI;
bank = sBattler_AI;
else
bank = gBankTarget;
bank = gBattlerTarget;
if (gBattleMons[bank].statStages[gAIScriptPtr[2]] > gAIScriptPtr[3])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
@@ -1697,9 +1679,9 @@ static void BattleAICmd_if_stat_level_equal(void)
u32 bank;
if (gAIScriptPtr[1] == AI_USER)
bank = sBank_AI;
bank = sBattler_AI;
else
bank = gBankTarget;
bank = gBattlerTarget;
if (gBattleMons[bank].statStages[gAIScriptPtr[2]] == gAIScriptPtr[3])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
@@ -1712,9 +1694,9 @@ static void BattleAICmd_if_stat_level_not_equal(void)
u32 bank;
if (gAIScriptPtr[1] == AI_USER)
bank = sBank_AI;
bank = sBattler_AI;
else
bank = gBankTarget;
bank = gBattlerTarget;
if (gBattleMons[bank].statStages[gAIScriptPtr[2]] != gAIScriptPtr[3])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
@@ -1733,11 +1715,11 @@ static void BattleAICmd_if_can_faint(void)
gDynamicBasePower = 0;
gBattleStruct->dynamicMoveType = 0;
gBattleScripting.dmgMultiplier = 1;
gBattleMoveFlags = 0;
gMoveResultFlags = 0;
gCritMultiplier = 1;
gCurrentMove = AI_THINKING_STRUCT->moveConsidered;
AI_CalcDmg(sBank_AI, gBankTarget);
TypeCalc(gCurrentMove, sBank_AI, gBankTarget);
AI_CalcDmg(sBattler_AI, gBattlerTarget);
TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget);
gBattleMoveDamage = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[AI_THINKING_STRUCT->movesetIndex] / 100;
@@ -1745,7 +1727,7 @@ static void BattleAICmd_if_can_faint(void)
if (gBattleMoveDamage == 0)
gBattleMoveDamage = 1;
if (gBattleMons[gBankTarget].hp <= gBattleMoveDamage)
if (gBattleMons[gBattlerTarget].hp <= gBattleMoveDamage)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1);
else
gAIScriptPtr += 5;
@@ -1762,17 +1744,17 @@ static void BattleAICmd_if_cant_faint(void)
gDynamicBasePower = 0;
gBattleStruct->dynamicMoveType = 0;
gBattleScripting.dmgMultiplier = 1;
gBattleMoveFlags = 0;
gMoveResultFlags = 0;
gCritMultiplier = 1;
gCurrentMove = AI_THINKING_STRUCT->moveConsidered;
AI_CalcDmg(sBank_AI, gBankTarget);
TypeCalc(gCurrentMove, sBank_AI, gBankTarget);
AI_CalcDmg(sBattler_AI, gBattlerTarget);
TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget);
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)
if (gBattleMons[gBattlerTarget].hp > gBattleMoveDamage)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1);
else
gAIScriptPtr += 5;
@@ -1788,7 +1770,7 @@ static void BattleAICmd_if_has_move(void)
case AI_USER:
for (i = 0; i < 4; i++)
{
if (gBattleMons[sBank_AI].moves[i] == *movePtr)
if (gBattleMons[sBattler_AI].moves[i] == *movePtr)
break;
}
if (i == 4)
@@ -1802,7 +1784,7 @@ static void BattleAICmd_if_has_move(void)
return;
}
case AI_USER_PARTNER:
if (gBattleMons[sBank_AI ^ BIT_MON].hp == 0)
if (gBattleMons[sBattler_AI ^ BIT_FLANK].hp == 0)
{
gAIScriptPtr += 8;
return;
@@ -1811,7 +1793,7 @@ static void BattleAICmd_if_has_move(void)
{
for (i = 0; i < 4; i++)
{
if (gBattleMons[sBank_AI ^ BIT_MON].moves[i] == *movePtr)
if (gBattleMons[sBattler_AI ^ BIT_FLANK].moves[i] == *movePtr)
break;
}
}
@@ -1829,7 +1811,7 @@ static void BattleAICmd_if_has_move(void)
case AI_TARGET_PARTNER:
for (i = 0; i < 4; i++)
{
if (BATTLE_HISTORY->usedMoves[gBankTarget].moves[i] == *movePtr)
if (BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] == *movePtr)
break;
}
if (i == 4)
@@ -1856,7 +1838,7 @@ static void BattleAICmd_if_doesnt_have_move(void)
case AI_USER_PARTNER: // UB: no separate check for user partner
for (i = 0; i < 4; i++)
{
if (gBattleMons[sBank_AI].moves[i] == *movePtr)
if (gBattleMons[sBattler_AI].moves[i] == *movePtr)
break;
}
if (i != 4)
@@ -1873,7 +1855,7 @@ static void BattleAICmd_if_doesnt_have_move(void)
case AI_TARGET_PARTNER:
for (i = 0; i < 4; i++)
{
if (BATTLE_HISTORY->usedMoves[gBankTarget].moves[i] == *movePtr)
if (BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] == *movePtr)
break;
}
if (i != 4)
@@ -1899,7 +1881,7 @@ static void BattleAICmd_if_has_move_with_effect(void)
case AI_USER_PARTNER:
for (i = 0; i < 4; i++)
{
if (gBattleMons[sBank_AI].moves[i] != 0 && gBattleMoves[gBattleMons[sBank_AI].moves[i]].effect == gAIScriptPtr[2])
if (gBattleMons[sBattler_AI].moves[i] != 0 && gBattleMoves[gBattleMons[sBattler_AI].moves[i]].effect == gAIScriptPtr[2])
break;
}
if (i == 4)
@@ -1911,8 +1893,8 @@ static void BattleAICmd_if_has_move_with_effect(void)
case AI_TARGET_PARTNER:
for (i = 0; i < 4; i++)
{
// UB: checks sBank_AI instead of gBankTarget
if (gBattleMons[sBank_AI].moves[i] != 0 && gBattleMoves[BATTLE_HISTORY->usedMoves[gBankTarget].moves[i]].effect == gAIScriptPtr[2])
// UB: checks sBattler_AI instead of gBattlerTarget
if (gBattleMons[sBattler_AI].moves[i] != 0 && gBattleMoves[BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i]].effect == gAIScriptPtr[2])
break;
}
if (i == 4)
@@ -1933,7 +1915,7 @@ static void BattleAICmd_if_doesnt_have_move_with_effect(void)
case AI_USER_PARTNER:
for (i = 0; i < 4; i++)
{
if(gBattleMons[sBank_AI].moves[i] != 0 && gBattleMoves[gBattleMons[sBank_AI].moves[i]].effect == gAIScriptPtr[2])
if(gBattleMons[sBattler_AI].moves[i] != 0 && gBattleMoves[gBattleMons[sBattler_AI].moves[i]].effect == gAIScriptPtr[2])
break;
}
if (i != 4)
@@ -1945,7 +1927,7 @@ static void BattleAICmd_if_doesnt_have_move_with_effect(void)
case AI_TARGET_PARTNER:
for (i = 0; i < 4; i++)
{
if (BATTLE_HISTORY->usedMoves[gBankTarget].moves[i] && gBattleMoves[BATTLE_HISTORY->usedMoves[gBankTarget].moves[i]].effect == gAIScriptPtr[2])
if (BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i] && gBattleMoves[BATTLE_HISTORY->usedMoves[gBattlerTarget].moves[i]].effect == gAIScriptPtr[2])
break;
}
if (i != 4)
@@ -1961,9 +1943,9 @@ static void BattleAICmd_if_any_move_disabled_or_encored(void)
u8 bank;
if (gAIScriptPtr[1] == AI_USER)
bank = sBank_AI;
bank = sBattler_AI;
else
bank = gBankTarget;
bank = gBattlerTarget;
if (gAIScriptPtr[2] == 0)
{
@@ -1993,7 +1975,7 @@ static void BattleAICmd_if_curr_move_disabled_or_encored(void)
switch (gAIScriptPtr[1])
{
case 0:
if (gDisableStructs[gActiveBank].disabledMove == AI_THINKING_STRUCT->moveConsidered)
if (gDisableStructs[gActiveBattler].disabledMove == AI_THINKING_STRUCT->moveConsidered)
{
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
return;
@@ -2001,7 +1983,7 @@ static void BattleAICmd_if_curr_move_disabled_or_encored(void)
gAIScriptPtr += 6;
return;
case 1:
if (gDisableStructs[gActiveBank].encoredMove == AI_THINKING_STRUCT->moveConsidered)
if (gDisableStructs[gActiveBattler].encoredMove == AI_THINKING_STRUCT->moveConsidered)
{
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
return;
@@ -2039,11 +2021,11 @@ static void BattleAICmd_get_hold_effect(void)
u8 bank;
if (gAIScriptPtr[1] == AI_USER)
bank = sBank_AI;
bank = sBattler_AI;
else
bank = gBankTarget;
bank = gBattlerTarget;
if (gActiveBank != bank)
if (gActiveBattler != bank)
AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(BATTLE_HISTORY->itemEffects[bank]);
else
AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(gBattleMons[bank].item);
@@ -2057,7 +2039,7 @@ static void BattleAICmd_if_holds_item(void)
u16 item;
u8 var1, var2;
if ((bank & BIT_SIDE) == (sBank_AI & BIT_SIDE))
if ((bank & BIT_SIDE) == (sBattler_AI & BIT_SIDE))
item = gBattleMons[bank].item;
else
item = BATTLE_HISTORY->itemEffects[bank];
@@ -2077,9 +2059,9 @@ static void BattleAICmd_get_gender(void)
u8 bank;
if (gAIScriptPtr[1] == AI_USER)
bank = sBank_AI;
bank = sBattler_AI;
else
bank = gBankTarget;
bank = gBattlerTarget;
AI_THINKING_STRUCT->funcResult = GetGenderFromSpeciesAndPersonality(gBattleMons[bank].species, gBattleMons[bank].personality);
@@ -2091,9 +2073,9 @@ static void BattleAICmd_is_first_turn_for(void)
u8 bank;
if (gAIScriptPtr[1] == AI_USER)
bank = sBank_AI;
bank = sBattler_AI;
else
bank = gBankTarget;
bank = gBattlerTarget;
AI_THINKING_STRUCT->funcResult = gDisableStructs[bank].isFirstTurn;
@@ -2105,9 +2087,9 @@ static void BattleAICmd_get_stockpile_count(void)
u8 bank;
if (gAIScriptPtr[1] == AI_USER)
bank = sBank_AI;
bank = sBattler_AI;
else
bank = gBankTarget;
bank = gBattlerTarget;
AI_THINKING_STRUCT->funcResult = gDisableStructs[bank].stockpileCounter;
@@ -2126,9 +2108,9 @@ static void BattleAICmd_get_used_held_item(void)
u8 bank;
if (gAIScriptPtr[1] == AI_USER)
bank = sBank_AI;
bank = sBattler_AI;
else
bank = gBankTarget;
bank = gBattlerTarget;
// This is likely a leftover from Ruby's code and its ugly ewram access
#ifdef NONMATCHING
@@ -2166,9 +2148,9 @@ static void BattleAICmd_get_protect_count(void)
u8 bank;
if (gAIScriptPtr[1] == AI_USER)
bank = sBank_AI;
bank = sBattler_AI;
else
bank = gBankTarget;
bank = gBattlerTarget;
AI_THINKING_STRUCT->funcResult = gDisableStructs[bank].protectUses;
@@ -2221,7 +2203,7 @@ static void BattleAICmd_if_level_cond(void)
switch (gAIScriptPtr[1])
{
case 0: // greater than
if (gBattleMons[sBank_AI].level > gBattleMons[gBankTarget].level)
if (gBattleMons[sBattler_AI].level > gBattleMons[gBattlerTarget].level)
{
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
return;
@@ -2229,7 +2211,7 @@ static void BattleAICmd_if_level_cond(void)
gAIScriptPtr += 6;
return;
case 1: // less than
if (gBattleMons[sBank_AI].level < gBattleMons[gBankTarget].level)
if (gBattleMons[sBattler_AI].level < gBattleMons[gBattlerTarget].level)
{
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
return;
@@ -2237,7 +2219,7 @@ static void BattleAICmd_if_level_cond(void)
gAIScriptPtr += 6;
return;
case 2: // equal
if (gBattleMons[sBank_AI].level == gBattleMons[gBankTarget].level)
if (gBattleMons[sBattler_AI].level == gBattleMons[gBattlerTarget].level)
{
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
return;
@@ -2249,7 +2231,7 @@ static void BattleAICmd_if_level_cond(void)
static void BattleAICmd_if_target_taunted(void)
{
if (gDisableStructs[gBankTarget].tauntTimer1 != 0)
if (gDisableStructs[gBattlerTarget].tauntTimer1 != 0)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1);
else
gAIScriptPtr += 5;
@@ -2257,7 +2239,7 @@ static void BattleAICmd_if_target_taunted(void)
static void BattleAICmd_if_target_not_taunted(void)
{
if (gDisableStructs[gBankTarget].tauntTimer1 == 0)
if (gDisableStructs[gBattlerTarget].tauntTimer1 == 0)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1);
else
gAIScriptPtr += 5;
@@ -2265,7 +2247,7 @@ static void BattleAICmd_if_target_not_taunted(void)
static void BattleAICmd_if_target_is_ally(void)
{
if ((sBank_AI & BIT_SIDE) == (gBankTarget & BIT_SIDE))
if ((sBattler_AI & BIT_SIDE) == (gBattlerTarget & BIT_SIDE))
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 1);
else
gAIScriptPtr += 5;
+162 -176
View File
@@ -10,21 +10,7 @@
#include "constants/items.h"
#include "pokemon_item_effects.h"
extern u8 gActiveBank;
extern u8 gAbsentBankFlags;
extern u32 gBattleTypeFlags;
extern u32 gStatuses3[BATTLE_BANKS_COUNT];
extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT];
extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
extern u16 gLastLandedMoves[BATTLE_BANKS_COUNT];
extern u8 gLastHitBy[BATTLE_BANKS_COUNT];
extern u16 gDynamicBasePower;
extern u8 gBattleMoveFlags;
extern u8 gCritMultiplier;
extern s32 gBattleMoveDamage;
extern const struct BattleMove gBattleMoves[];
extern const struct BaseStats gBaseStats[];
extern const u8 gTypeEffectiveness[];
extern const u8 * const gItemEffectTable[]; // todo: fix once struct is declared
@@ -35,11 +21,11 @@ static bool8 ShouldUseItem(void);
static bool8 ShouldSwitchIfPerishSong(void)
{
if (gStatuses3[gActiveBank] & STATUS3_PERISH_SONG
&& gDisableStructs[gActiveBank].perishSongTimer1 == 0)
if (gStatuses3[gActiveBattler] & STATUS3_PERISH_SONG
&& gDisableStructs[gActiveBattler].perishSongTimer1 == 0)
{
*(gBattleStruct->AI_monToSwitchIntoId + gActiveBank) = 6;
EmitTwoReturnValues(1, ACTION_SWITCH, 0);
*(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = 6;
BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
}
@@ -48,7 +34,7 @@ static bool8 ShouldSwitchIfPerishSong(void)
static bool8 ShouldSwitchIfWonderGuard(void)
{
u8 opposingIdentity;
u8 opposingPosition;
u8 opposingBank;
u8 moveFlags;
s32 i, j;
@@ -60,27 +46,27 @@ static bool8 ShouldSwitchIfWonderGuard(void)
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
return FALSE;
opposingIdentity = GetBankIdentity(gActiveBank) ^ BIT_SIDE;
opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(gActiveBattler));
if (gBattleMons[GetBankByIdentity(opposingIdentity)].ability != ABILITY_WONDER_GUARD)
if (gBattleMons[GetBattlerAtPosition(opposingPosition)].ability != ABILITY_WONDER_GUARD)
return FALSE;
// check if pokemon has a super effective move
for (opposingBank = GetBankByIdentity(opposingIdentity), i = 0; i < 4; i++)
for (opposingBank = GetBattlerAtPosition(opposingPosition), i = 0; i < 4; i++)
{
move = gBattleMons[gActiveBank].moves[i];
move = gBattleMons[gActiveBattler].moves[i];
if (move == MOVE_NONE)
continue;
moveFlags = AI_TypeCalc(move, gBattleMons[opposingBank].species, gBattleMons[opposingBank].ability);
if (moveFlags & MOVESTATUS_SUPEREFFECTIVE)
if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE)
return FALSE;
}
// get party information
if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
{
if ((gActiveBank & BIT_MON) == 0)
if ((gActiveBattler & BIT_FLANK) == 0)
firstId = 0, lastId = 3;
else
firstId = 3, lastId = 6;
@@ -90,7 +76,7 @@ static bool8 ShouldSwitchIfWonderGuard(void)
firstId = 0, lastId = 6;
}
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
@@ -104,24 +90,24 @@ static bool8 ShouldSwitchIfWonderGuard(void)
continue;
if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG)
continue;
if (i == gBattlePartyID[gActiveBank])
if (i == gBattlerPartyIndexes[gActiveBattler])
continue;
GetMonData(&party[i], MON_DATA_SPECIES); // unused return value
GetMonData(&party[i], MON_DATA_ALT_ABILITY); // unused return value
for (opposingBank = GetBankByIdentity(opposingIdentity), j = 0; j < 4; j++)
for (opposingBank = GetBattlerAtPosition(opposingPosition), j = 0; j < 4; j++)
{
move = GetMonData(&party[i], MON_DATA_MOVE1 + j);
if (move == MOVE_NONE)
continue;
moveFlags = AI_TypeCalc(move, gBattleMons[opposingBank].species, gBattleMons[opposingBank].ability);
if (moveFlags & MOVESTATUS_SUPEREFFECTIVE && Random() % 3 < 2)
if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && Random() % 3 < 2)
{
// we found a mon
*(gBattleStruct->AI_monToSwitchIntoId + gActiveBank) = i;
EmitTwoReturnValues(1, ACTION_SWITCH, 0);
*(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = i;
BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
}
}
@@ -141,42 +127,42 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void)
if (HasSuperEffectiveMoveAgainstOpponents(TRUE) && Random() % 3 != 0)
return FALSE;
if (gLastLandedMoves[gActiveBank] == 0)
if (gLastLandedMoves[gActiveBattler] == 0)
return FALSE;
if (gLastLandedMoves[gActiveBank] == 0xFFFF)
if (gLastLandedMoves[gActiveBattler] == 0xFFFF)
return FALSE;
if (gBattleMoves[gLastLandedMoves[gActiveBank]].power == 0)
if (gBattleMoves[gLastLandedMoves[gActiveBattler]].power == 0)
return FALSE;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
bankIn1 = gActiveBank;
if (gAbsentBankFlags & gBitTable[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)])
bankIn2 = gActiveBank;
bankIn1 = gActiveBattler;
if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))])
bankIn2 = gActiveBattler;
else
bankIn2 = GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON);
bankIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)));
}
else
{
bankIn1 = gActiveBank;
bankIn2 = gActiveBank;
bankIn1 = gActiveBattler;
bankIn2 = gActiveBattler;
}
if (gBattleMoves[gLastLandedMoves[gActiveBank]].type == TYPE_FIRE)
if (gBattleMoves[gLastLandedMoves[gActiveBattler]].type == TYPE_FIRE)
absorbingTypeAbility = ABILITY_FLASH_FIRE;
else if (gBattleMoves[gLastLandedMoves[gActiveBank]].type == TYPE_WATER)
else if (gBattleMoves[gLastLandedMoves[gActiveBattler]].type == TYPE_WATER)
absorbingTypeAbility = ABILITY_WATER_ABSORB;
else if (gBattleMoves[gLastLandedMoves[gActiveBank]].type == TYPE_ELECTRIC)
else if (gBattleMoves[gLastLandedMoves[gActiveBattler]].type == TYPE_ELECTRIC)
absorbingTypeAbility = ABILITY_VOLT_ABSORB;
else
return FALSE;
if (gBattleMons[gActiveBank].ability == absorbingTypeAbility)
if (gBattleMons[gActiveBattler].ability == absorbingTypeAbility)
return FALSE;
if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
{
if ((gActiveBank & BIT_MON) == 0)
if ((gActiveBattler & BIT_FLANK) == 0)
firstId = 0, lastId = 3;
else
firstId = 3, lastId = 6;
@@ -186,7 +172,7 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void)
firstId = 0, lastId = 6;
}
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
@@ -202,9 +188,9 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void)
continue;
if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG)
continue;
if (i == gBattlePartyID[bankIn1])
if (i == gBattlerPartyIndexes[bankIn1])
continue;
if (i == gBattlePartyID[bankIn2])
if (i == gBattlerPartyIndexes[bankIn2])
continue;
if (i == *(gBattleStruct->monToSwitchIntoId + bankIn1))
continue;
@@ -220,8 +206,8 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void)
if (absorbingTypeAbility == monAbility && Random() & 1)
{
// we found a mon
*(gBattleStruct->AI_monToSwitchIntoId + gActiveBank) = i;
EmitTwoReturnValues(1, ACTION_SWITCH, 0);
*(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = i;
BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
}
}
@@ -231,34 +217,34 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void)
static bool8 ShouldSwitchIfNaturalCure(void)
{
if (!(gBattleMons[gActiveBank].status1 & STATUS_SLEEP))
if (!(gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP))
return FALSE;
if (gBattleMons[gActiveBank].ability != ABILITY_NATURAL_CURE)
if (gBattleMons[gActiveBattler].ability != ABILITY_NATURAL_CURE)
return FALSE;
if (gBattleMons[gActiveBank].hp < gBattleMons[gActiveBank].maxHP / 2)
if (gBattleMons[gActiveBattler].hp < gBattleMons[gActiveBattler].maxHP / 2)
return FALSE;
if ((gLastLandedMoves[gActiveBank] == 0 || gLastLandedMoves[gActiveBank] == 0xFFFF) && Random() & 1)
if ((gLastLandedMoves[gActiveBattler] == 0 || gLastLandedMoves[gActiveBattler] == 0xFFFF) && Random() & 1)
{
*(gBattleStruct->AI_monToSwitchIntoId + gActiveBank) = 6;
EmitTwoReturnValues(1, ACTION_SWITCH, 0);
*(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = 6;
BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
}
else if (gBattleMoves[gLastLandedMoves[gActiveBank]].power == 0 && Random() & 1)
else if (gBattleMoves[gLastLandedMoves[gActiveBattler]].power == 0 && Random() & 1)
{
*(gBattleStruct->AI_monToSwitchIntoId + gActiveBank) = 6;
EmitTwoReturnValues(1, ACTION_SWITCH, 0);
*(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = 6;
BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
}
if (FindMonWithFlagsAndSuperEffective(MOVESTATUS_NOTAFFECTED, 1))
if (FindMonWithFlagsAndSuperEffective(MOVE_RESULT_DOESNT_AFFECT_FOE, 1))
return TRUE;
if (FindMonWithFlagsAndSuperEffective(MOVESTATUS_NOTVERYEFFECTIVE, 1))
if (FindMonWithFlagsAndSuperEffective(MOVE_RESULT_NOT_VERY_EFFECTIVE, 1))
return TRUE;
if (Random() & 1)
{
*(gBattleStruct->AI_monToSwitchIntoId + gActiveBank) = 6;
EmitTwoReturnValues(1, ACTION_SWITCH, 0);
*(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = 6;
BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
}
@@ -267,25 +253,25 @@ static bool8 ShouldSwitchIfNaturalCure(void)
static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng)
{
u8 opposingIdentity;
u8 opposingPosition;
u8 opposingBank;
s32 i;
u8 moveFlags;
u16 move;
opposingIdentity = GetBankIdentity(gActiveBank) ^ BIT_SIDE;
opposingBank = GetBankByIdentity(opposingIdentity);
opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(gActiveBattler));
opposingBank = GetBattlerAtPosition(opposingPosition);
if (!(gAbsentBankFlags & gBitTable[opposingBank]))
if (!(gAbsentBattlerFlags & gBitTable[opposingBank]))
{
for (i = 0; i < 4; i++)
{
move = gBattleMons[gActiveBank].moves[i];
move = gBattleMons[gActiveBattler].moves[i];
if (move == MOVE_NONE)
continue;
moveFlags = AI_TypeCalc(move, gBattleMons[opposingBank].species, gBattleMons[opposingBank].ability);
if (moveFlags & MOVESTATUS_SUPEREFFECTIVE)
if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE)
{
if (noRng)
return TRUE;
@@ -297,18 +283,18 @@ static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng)
if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
return FALSE;
opposingBank = GetBankByIdentity(opposingIdentity ^ BIT_MON);
opposingBank = GetBattlerAtPosition(BATTLE_PARTNER(opposingPosition));
if (!(gAbsentBankFlags & gBitTable[opposingBank]))
if (!(gAbsentBattlerFlags & gBitTable[opposingBank]))
{
for (i = 0; i < 4; i++)
{
move = gBattleMons[gActiveBank].moves[i];
move = gBattleMons[gActiveBattler].moves[i];
if (move == MOVE_NONE)
continue;
moveFlags = AI_TypeCalc(move, gBattleMons[opposingBank].species, gBattleMons[opposingBank].ability);
if (moveFlags & MOVESTATUS_SUPEREFFECTIVE)
if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE)
{
if (noRng)
return TRUE;
@@ -328,8 +314,8 @@ static bool8 AreStatsRaised(void)
for (i = 0; i < BATTLE_STATS_NO; i++)
{
if (gBattleMons[gActiveBank].statStages[i] > 6)
buffedStatsValue += gBattleMons[gActiveBank].statStages[i] - 6;
if (gBattleMons[gActiveBattler].statStages[i] > 6)
buffedStatsValue += gBattleMons[gActiveBattler].statStages[i] - 6;
}
return (buffedStatsValue > 3);
@@ -345,32 +331,32 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent)
u16 move;
u8 moveFlags;
if (gLastLandedMoves[gActiveBank] == 0)
if (gLastLandedMoves[gActiveBattler] == 0)
return FALSE;
if (gLastLandedMoves[gActiveBank] == 0xFFFF)
if (gLastLandedMoves[gActiveBattler] == 0xFFFF)
return FALSE;
if (gLastHitBy[gActiveBank] == 0xFF)
if (gLastHitBy[gActiveBattler] == 0xFF)
return FALSE;
if (gBattleMoves[gLastLandedMoves[gActiveBank]].power == 0)
if (gBattleMoves[gLastLandedMoves[gActiveBattler]].power == 0)
return FALSE;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
bankIn1 = gActiveBank;
if (gAbsentBankFlags & gBitTable[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)])
bankIn2 = gActiveBank;
bankIn1 = gActiveBattler;
if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))])
bankIn2 = gActiveBattler;
else
bankIn2 = GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON);
bankIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)));
}
else
{
bankIn1 = gActiveBank;
bankIn2 = gActiveBank;
bankIn1 = gActiveBattler;
bankIn2 = gActiveBattler;
}
if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
{
if ((gActiveBank & BIT_MON) == 0)
if ((gActiveBattler & BIT_FLANK) == 0)
firstId = 0, lastId = 3;
else
firstId = 3, lastId = 6;
@@ -380,7 +366,7 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent)
firstId = 0, lastId = 6;
}
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
@@ -396,9 +382,9 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent)
continue;
if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG)
continue;
if (i == gBattlePartyID[bankIn1])
if (i == gBattlerPartyIndexes[bankIn1])
continue;
if (i == gBattlePartyID[bankIn2])
if (i == gBattlerPartyIndexes[bankIn2])
continue;
if (i == *(gBattleStruct->monToSwitchIntoId + bankIn1))
continue;
@@ -411,10 +397,10 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent)
else
monAbility = gBaseStats[species].ability1;
moveFlags = AI_TypeCalc(gLastLandedMoves[gActiveBank], species, monAbility);
moveFlags = AI_TypeCalc(gLastLandedMoves[gActiveBattler], species, monAbility);
if (moveFlags & flags)
{
bankIn1 = gLastHitBy[gActiveBank];
bankIn1 = gLastHitBy[gActiveBattler];
for (j = 0; j < 4; j++)
{
@@ -423,10 +409,10 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent)
continue;
moveFlags = AI_TypeCalc(move, gBattleMons[bankIn1].species, gBattleMons[bankIn1].ability);
if (moveFlags & MOVESTATUS_SUPEREFFECTIVE && Random() % moduloPercent == 0)
if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && Random() % moduloPercent == 0)
{
*(gBattleStruct->AI_monToSwitchIntoId + gActiveBank) = i;
EmitTwoReturnValues(1, ACTION_SWITCH, 0);
*(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = i;
BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
}
}
@@ -446,19 +432,19 @@ static bool8 ShouldSwitch(void)
s32 i;
s32 availableToSwitch;
if (gBattleMons[*(activeBankPtr = &gActiveBank)].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION))
if (gBattleMons[*(activeBankPtr = &gActiveBattler)].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION))
return FALSE;
if (gStatuses3[gActiveBank] & STATUS3_ROOTED)
if (gStatuses3[gActiveBattler] & STATUS3_ROOTED)
return FALSE;
if (AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gActiveBank, ABILITY_SHADOW_TAG, 0, 0))
if (AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gActiveBattler, ABILITY_SHADOW_TAG, 0, 0))
return FALSE;
if (AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gActiveBank, ABILITY_ARENA_TRAP, 0, 0))
if (AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gActiveBattler, ABILITY_ARENA_TRAP, 0, 0))
return FALSE; // misses the flying or levitate check
if (AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_MAGNET_PULL, 0, 0))
{
if (gBattleMons[gActiveBank].type1 == TYPE_STEEL)
if (gBattleMons[gActiveBattler].type1 == TYPE_STEEL)
return FALSE;
if (gBattleMons[gActiveBank].type2 == TYPE_STEEL)
if (gBattleMons[gActiveBattler].type2 == TYPE_STEEL)
return FALSE;
}
if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
@@ -468,10 +454,10 @@ static bool8 ShouldSwitch(void)
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
bankIn1 = *activeBankPtr;
if (gAbsentBankFlags & gBitTable[GetBankByIdentity(GetBankIdentity(*activeBankPtr) ^ BIT_MON)])
if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(GetBattlerPosition(*activeBankPtr) ^ BIT_FLANK)])
bankIn2 = *activeBankPtr;
else
bankIn2 = GetBankByIdentity(GetBankIdentity(*activeBankPtr) ^ BIT_MON);
bankIn2 = GetBattlerAtPosition(GetBattlerPosition(*activeBankPtr) ^ BIT_FLANK);
}
else
{
@@ -481,7 +467,7 @@ static bool8 ShouldSwitch(void)
if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
{
if ((gActiveBank & BIT_MON) == 0)
if ((gActiveBattler & BIT_FLANK) == 0)
firstId = 0, lastId = 3;
else
firstId = 3, lastId = 6;
@@ -491,7 +477,7 @@ static bool8 ShouldSwitch(void)
firstId = 0, lastId = 6;
}
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
@@ -504,9 +490,9 @@ static bool8 ShouldSwitch(void)
continue;
if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG)
continue;
if (i == gBattlePartyID[bankIn1])
if (i == gBattlerPartyIndexes[bankIn1])
continue;
if (i == gBattlePartyID[bankIn2])
if (i == gBattlerPartyIndexes[bankIn2])
continue;
if (i == *(gBattleStruct->monToSwitchIntoId + bankIn1))
continue;
@@ -530,8 +516,8 @@ static bool8 ShouldSwitch(void)
return FALSE;
if (AreStatsRaised())
return FALSE;
if (FindMonWithFlagsAndSuperEffective(MOVESTATUS_NOTAFFECTED, 2)
|| FindMonWithFlagsAndSuperEffective(MOVESTATUS_NOTVERYEFFECTIVE, 3))
if (FindMonWithFlagsAndSuperEffective(MOVE_RESULT_DOESNT_AFFECT_FOE, 2)
|| FindMonWithFlagsAndSuperEffective(MOVE_RESULT_NOT_VERY_EFFECTIVE, 3))
return TRUE;
return FALSE;
@@ -543,9 +529,9 @@ void AI_TrySwitchOrUseItem(void)
u8 bankIn1, bankIn2;
s32 firstId;
s32 lastId; // + 1
u8 bankIdentity = GetBankIdentity(gActiveBank);
u8 bankIdentity = GetBattlerPosition(gActiveBattler);
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
@@ -554,25 +540,25 @@ void AI_TrySwitchOrUseItem(void)
{
if (ShouldSwitch())
{
if (*(gBattleStruct->AI_monToSwitchIntoId + gActiveBank) == 6)
if (*(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) == 6)
{
s32 monToSwitchId = GetMostSuitableMonToSwitchInto();
if (monToSwitchId == 6)
{
if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
{
bankIn1 = GetBankByIdentity(bankIdentity);
bankIn1 = GetBattlerAtPosition(bankIdentity);
bankIn2 = bankIn1;
}
else
{
bankIn1 = GetBankByIdentity(bankIdentity);
bankIn2 = GetBankByIdentity(bankIdentity ^ BIT_MON);
bankIn1 = GetBattlerAtPosition(bankIdentity);
bankIn2 = GetBattlerAtPosition(bankIdentity ^ BIT_FLANK);
}
if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
{
if ((gActiveBank & BIT_MON) == 0)
if ((gActiveBattler & BIT_FLANK) == 0)
firstId = 0, lastId = 3;
else
firstId = 3, lastId = 6;
@@ -586,9 +572,9 @@ void AI_TrySwitchOrUseItem(void)
{
if (GetMonData(&party[monToSwitchId], MON_DATA_HP) == 0)
continue;
if (monToSwitchId == gBattlePartyID[bankIn1])
if (monToSwitchId == gBattlerPartyIndexes[bankIn1])
continue;
if (monToSwitchId == gBattlePartyID[bankIn2])
if (monToSwitchId == gBattlerPartyIndexes[bankIn2])
continue;
if (monToSwitchId == *(gBattleStruct->monToSwitchIntoId + bankIn1))
continue;
@@ -599,10 +585,10 @@ void AI_TrySwitchOrUseItem(void)
}
}
*(gBattleStruct->AI_monToSwitchIntoId + gActiveBank) = monToSwitchId;
*(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = monToSwitchId;
}
*(gBattleStruct->monToSwitchIntoId + gActiveBank) = *(gBattleStruct->AI_monToSwitchIntoId + gActiveBank);
*(gBattleStruct->monToSwitchIntoId + gActiveBattler) = *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler);
return;
}
else if (ShouldUseItem())
@@ -611,7 +597,7 @@ void AI_TrySwitchOrUseItem(void)
}
}
EmitTwoReturnValues(1, ACTION_USE_MOVE, (gActiveBank ^ BIT_SIDE) << 8);
BtlController_EmitTwoReturnValues(1, B_ACTION_USE_MOVE, (gActiveBattler ^ BIT_SIDE) << 8);
}
static void ModulateByTypeEffectiveness(u8 atkType, u8 defType1, u8 defType2, u8 *var)
@@ -651,34 +637,34 @@ u8 GetMostSuitableMonToSwitchInto(void)
u8 invalidMons;
u16 move;
if (*(gBattleStruct->monToSwitchIntoId + gActiveBank) != 6)
return *(gBattleStruct->monToSwitchIntoId + gActiveBank);
if (*(gBattleStruct->monToSwitchIntoId + gActiveBattler) != 6)
return *(gBattleStruct->monToSwitchIntoId + gActiveBattler);
if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
return gBattlePartyID[gActiveBank] + 1;
return gBattlerPartyIndexes[gActiveBattler] + 1;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
bankIn1 = gActiveBank;
if (gAbsentBankFlags & gBitTable[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)])
bankIn2 = gActiveBank;
bankIn1 = gActiveBattler;
if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK)])
bankIn2 = gActiveBattler;
else
bankIn2 = GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON);
bankIn2 = GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK);
// UB: It considers the opponent only player's side even though it can battle alongside player;
opposingBank = Random() & BIT_MON;
if (gAbsentBankFlags & gBitTable[opposingBank])
opposingBank ^= BIT_MON;
opposingBank = Random() & BIT_FLANK;
if (gAbsentBattlerFlags & gBitTable[opposingBank])
opposingBank ^= BIT_FLANK;
}
else
{
opposingBank = GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_SIDE);
bankIn1 = gActiveBank;
bankIn2 = gActiveBank;
opposingBank = GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_SIDE);
bankIn1 = gActiveBattler;
bankIn2 = gActiveBattler;
}
if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
{
if ((gActiveBank & BIT_MON) == 0)
if ((gActiveBattler & BIT_FLANK) == 0)
firstId = 0, lastId = 3;
else
firstId = 3, lastId = 6;
@@ -688,7 +674,7 @@ u8 GetMostSuitableMonToSwitchInto(void)
firstId = 0, lastId = 6;
}
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
@@ -706,8 +692,8 @@ u8 GetMostSuitableMonToSwitchInto(void)
if (species != SPECIES_NONE
&& GetMonData(&party[i], MON_DATA_HP) != 0
&& !(gBitTable[i] & invalidMons)
&& gBattlePartyID[bankIn1] != i
&& gBattlePartyID[bankIn2] != i
&& gBattlerPartyIndexes[bankIn1] != i
&& gBattlerPartyIndexes[bankIn2] != i
&& i != *(gBattleStruct->monToSwitchIntoId + bankIn1)
&& i != *(gBattleStruct->monToSwitchIntoId + bankIn2))
{
@@ -734,7 +720,7 @@ u8 GetMostSuitableMonToSwitchInto(void)
for (i = 0; i < 4; i++)
{
move = GetMonData(&party[bestMonId], MON_DATA_MOVE1 + i);
if (move != MOVE_NONE && TypeCalc(move, gActiveBank, opposingBank) & MOVESTATUS_SUPEREFFECTIVE)
if (move != MOVE_NONE && TypeCalc(move, gActiveBattler, opposingBank) & MOVE_RESULT_SUPER_EFFECTIVE)
break;
}
@@ -752,7 +738,7 @@ u8 GetMostSuitableMonToSwitchInto(void)
gDynamicBasePower = 0;
gBattleStruct->dynamicMoveType = 0;
gBattleScripting.dmgMultiplier = 1;
gBattleMoveFlags = 0;
gMoveResultFlags = 0;
gCritMultiplier = 1;
bestDmg = 0;
bestMonId = 6;
@@ -764,9 +750,9 @@ u8 GetMostSuitableMonToSwitchInto(void)
continue;
if (GetMonData(&party[i], MON_DATA_HP) == 0)
continue;
if (gBattlePartyID[bankIn1] == i)
if (gBattlerPartyIndexes[bankIn1] == i)
continue;
if (gBattlePartyID[bankIn2] == i)
if (gBattlerPartyIndexes[bankIn2] == i)
continue;
if (i == *(gBattleStruct->monToSwitchIntoId + bankIn1))
continue;
@@ -779,8 +765,8 @@ u8 GetMostSuitableMonToSwitchInto(void)
gBattleMoveDamage = 0;
if (move != MOVE_NONE && gBattleMoves[move].power != 1)
{
AI_CalcDmg(gActiveBank, opposingBank);
TypeCalc(move, gActiveBank, opposingBank);
AI_CalcDmg(gActiveBattler, opposingBank);
TypeCalc(move, gActiveBattler, opposingBank);
}
if (bestDmg < gBattleMoveDamage)
{
@@ -817,10 +803,10 @@ static bool8 ShouldUseItem(void)
u8 validMons = 0;
bool8 shouldUse = FALSE;
if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && GetBankIdentity(gActiveBank) == IDENTITY_PLAYER_MON2)
if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT)
return FALSE;
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
@@ -855,14 +841,14 @@ static bool8 ShouldUseItem(void)
else
itemEffects = gItemEffectTable[item - 13];
*(gBattleStruct->AI_itemType + gActiveBank / 2) = GetAI_ItemType(item, itemEffects);
*(gBattleStruct->AI_itemType + gActiveBattler / 2) = GetAI_ItemType(item, itemEffects);
switch (*(gBattleStruct->AI_itemType + gActiveBank / 2))
switch (*(gBattleStruct->AI_itemType + gActiveBattler / 2))
{
case AI_ITEM_FULL_RESTORE:
if (gBattleMons[gActiveBank].hp >= gBattleMons[gActiveBank].maxHP / 4)
if (gBattleMons[gActiveBattler].hp >= gBattleMons[gActiveBattler].maxHP / 4)
break;
if (gBattleMons[gActiveBank].hp == 0)
if (gBattleMons[gActiveBattler].hp == 0)
break;
shouldUse = TRUE;
break;
@@ -870,65 +856,65 @@ static bool8 ShouldUseItem(void)
paramOffset = GetItemEffectParamOffset(item, 4, 4);
if (paramOffset == 0)
break;
if (gBattleMons[gActiveBank].hp == 0)
if (gBattleMons[gActiveBattler].hp == 0)
break;
if (gBattleMons[gActiveBank].hp < gBattleMons[gActiveBank].maxHP / 4 || gBattleMons[gActiveBank].maxHP - gBattleMons[gActiveBank].hp > itemEffects[paramOffset])
if (gBattleMons[gActiveBattler].hp < gBattleMons[gActiveBattler].maxHP / 4 || gBattleMons[gActiveBattler].maxHP - gBattleMons[gActiveBattler].hp > itemEffects[paramOffset])
shouldUse = TRUE;
break;
case AI_ITEM_CURE_CONDITION:
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) = 0;
if (itemEffects[3] & 0x20 && gBattleMons[gActiveBank].status1 & STATUS_SLEEP)
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) = 0;
if (itemEffects[3] & 0x20 && gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP)
{
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x20;
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x20;
shouldUse = TRUE;
}
if (itemEffects[3] & 0x10 && (gBattleMons[gActiveBank].status1 & STATUS_POISON || gBattleMons[gActiveBank].status1 & STATUS_TOXIC_POISON))
if (itemEffects[3] & 0x10 && (gBattleMons[gActiveBattler].status1 & STATUS1_POISON || gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_POISON))
{
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x10;
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x10;
shouldUse = TRUE;
}
if (itemEffects[3] & 0x8 && gBattleMons[gActiveBank].status1 & STATUS_BURN)
if (itemEffects[3] & 0x8 && gBattleMons[gActiveBattler].status1 & STATUS1_BURN)
{
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x8;
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x8;
shouldUse = TRUE;
}
if (itemEffects[3] & 0x4 && gBattleMons[gActiveBank].status1 & STATUS_FREEZE)
if (itemEffects[3] & 0x4 && gBattleMons[gActiveBattler].status1 & STATUS1_FREEZE)
{
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x4;
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x4;
shouldUse = TRUE;
}
if (itemEffects[3] & 0x2 && gBattleMons[gActiveBank].status1 & STATUS_PARALYSIS)
if (itemEffects[3] & 0x2 && gBattleMons[gActiveBattler].status1 & STATUS1_PARALYSIS)
{
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x2;
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x2;
shouldUse = TRUE;
}
if (itemEffects[3] & 0x1 && gBattleMons[gActiveBank].status2 & STATUS2_CONFUSION)
if (itemEffects[3] & 0x1 && gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION)
{
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x1;
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x1;
shouldUse = TRUE;
}
break;
case AI_ITEM_X_STAT:
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) = 0;
if (gDisableStructs[gActiveBank].isFirstTurn == 0)
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) = 0;
if (gDisableStructs[gActiveBattler].isFirstTurn == 0)
break;
if (itemEffects[0] & 0xF)
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x1;
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x1;
if (itemEffects[1] & 0xF0)
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x2;
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x2;
if (itemEffects[1] & 0xF)
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x4;
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x4;
if (itemEffects[2] & 0xF)
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x8;
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x8;
if (itemEffects[2] & 0xF0)
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x20;
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x20;
if (itemEffects[0] & 0x30)
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x80;
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x80;
shouldUse = TRUE;
break;
case AI_ITEM_GUARD_SPECS:
bankSide = GetBankSide(gActiveBank);
if (gDisableStructs[gActiveBank].isFirstTurn != 0 && gSideTimers[bankSide].mistTimer == 0)
bankSide = GetBattlerSide(gActiveBattler);
if (gDisableStructs[gActiveBattler].isFirstTurn != 0 && gSideTimers[bankSide].mistTimer == 0)
shouldUse = TRUE;
break;
case AI_ITEM_NOT_RECOGNIZABLE:
@@ -937,8 +923,8 @@ static bool8 ShouldUseItem(void)
if (shouldUse)
{
EmitTwoReturnValues(1, ACTION_USE_ITEM, 0);
*(gBattleStruct->chosenItem + (gActiveBank / 2) * 2) = item;
BtlController_EmitTwoReturnValues(1, B_ACTION_USE_ITEM, 0);
*(gBattleStruct->chosenItem + (gActiveBattler / 2) * 2) = item;
gBattleResources->battleHistory->trainerItems[i] = 0;
return shouldUse;
}
+90 -95
View File
@@ -25,8 +25,6 @@
#define ANIM_SPRITE_INDEX_COUNT 8
extern u8 gBankAttacker;
extern u8 gBankTarget;
extern u16 gBattle_WIN0H;
extern u16 gBattle_WIN0V;
extern u16 gBattle_WIN1H;
@@ -35,12 +33,9 @@ extern u16 gBattle_BG1_X;
extern u16 gBattle_BG1_Y;
extern u16 gBattle_BG2_X;
extern u16 gBattle_BG2_Y;
extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
extern u8 gBankSpriteIds[BATTLE_BANKS_COUNT];
extern struct MusicPlayerInfo gMPlayInfo_BGM;
extern struct MusicPlayerInfo gMPlayInfo_SE1;
extern struct MusicPlayerInfo gMPlayInfo_SE2;
extern u8 gDecompressionBuffer[];
extern const u16 gUnknown_082C8D64[];
extern const u8 * const gBattleAnims_Moves[];
@@ -130,9 +125,9 @@ EWRAM_DATA static u8 sMonAnimTaskIdArray[2] = {0};
EWRAM_DATA u8 gAnimMoveTurn = 0;
EWRAM_DATA static u8 sAnimBackgroundFadeState = 0;
EWRAM_DATA static u16 sAnimMoveIndex = 0; // set but unused.
EWRAM_DATA u8 gAnimBankAttacker = 0;
EWRAM_DATA u8 gAnimBankTarget = 0;
EWRAM_DATA u16 gAnimSpeciesByBanks[BATTLE_BANKS_COUNT] = {0};
EWRAM_DATA u8 gBattleAnimAttacker = 0;
EWRAM_DATA u8 gBattleAnimTarget = 0;
EWRAM_DATA u16 gAnimSpeciesByBanks[MAX_BATTLERS_COUNT] = {0};
EWRAM_DATA u8 gUnknown_02038440 = 0;
// const rom data
@@ -214,15 +209,15 @@ void ClearBattleAnimationVars(void)
gAnimMoveTurn = 0;
sAnimBackgroundFadeState = 0;
sAnimMoveIndex = 0;
gAnimBankAttacker = 0;
gAnimBankTarget = 0;
gBattleAnimAttacker = 0;
gBattleAnimTarget = 0;
gUnknown_02038440 = 0;
}
void DoMoveAnim(u16 move)
{
gAnimBankAttacker = gBankAttacker;
gAnimBankTarget = gBankTarget;
gBattleAnimAttacker = gBattlerAttacker;
gBattleAnimTarget = gBattlerTarget;
LaunchBattleAnimation(gBattleAnims_Moves, move, TRUE);
}
@@ -234,12 +229,12 @@ void LaunchBattleAnimation(const u8 *const animsTable[], u16 tableId, bool8 isMo
{
sub_80A8278();
UpdateOamPriorityInAllHealthboxes(0);
for (i = 0; i < BATTLE_BANKS_COUNT; i++)
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
if (GetBankSide(i) != 0)
gAnimSpeciesByBanks[i] = GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_SPECIES);
if (GetBattlerSide(i) != 0)
gAnimSpeciesByBanks[i] = GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES);
else
gAnimSpeciesByBanks[i] = GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_SPECIES);
gAnimSpeciesByBanks[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES);
}
}
else
@@ -409,7 +404,7 @@ static void ScriptCmd_createsprite(void)
else
argVar *= -1;
subpriority = sub_80A82E4(gAnimBankTarget) + (s8)(argVar);
subpriority = sub_80A82E4(gBattleAnimTarget) + (s8)(argVar);
}
else
{
@@ -418,13 +413,13 @@ static void ScriptCmd_createsprite(void)
else
argVar *= -1;
subpriority = sub_80A82E4(gAnimBankAttacker) + (s8)(argVar);
subpriority = sub_80A82E4(gBattleAnimAttacker) + (s8)(argVar);
}
if (subpriority < 3)
subpriority = 3;
CreateSpriteAndAnimate(template, GetBankPosition(gAnimBankTarget, 2), GetBankPosition(gAnimBankTarget, 3), subpriority);
CreateSpriteAndAnimate(template, GetBattlerSpriteCoord(gBattleAnimTarget, 2), GetBattlerSpriteCoord(gBattleAnimTarget, 3), subpriority);
gAnimVisualTaskCount++;
}
@@ -565,7 +560,7 @@ static void sub_80A40F4(u8 taskId)
u8 newTaskId;
s16 *selfData = gTasks[taskId].data;
u8 bankSpriteId = gBankSpriteIds[selfData[t1_MONBG_BANK]];
u8 bankSpriteId = gBattlerSpriteIds[selfData[t1_MONBG_BANK]];
gSprites[bankSpriteId].invisible = 1;
if (!selfData[t1_CREATE_ANOTHER_TASK])
@@ -607,14 +602,14 @@ static void ScriptCmd_monbg(void)
animBank = sBattleAnimScriptPtr[0];
if (animBank & ANIM_TARGET)
bank = gAnimBankTarget;
bank = gBattleAnimTarget;
else
bank = gAnimBankAttacker;
bank = gBattleAnimAttacker;
if (IsAnimBankSpriteVisible(bank))
if (IsBattlerSpriteVisible(bank))
{
u8 identity = GetBankIdentity(bank);
if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest())
u8 position = GetBattlerPosition(bank);
if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest())
toBG_2 = FALSE;
else
toBG_2 = TRUE;
@@ -629,11 +624,11 @@ static void ScriptCmd_monbg(void)
}
bank ^= BIT_MON;
if (IsAnimBankSpriteVisible(bank))
bank ^= BIT_FLANK;
if (IsBattlerSpriteVisible(bank))
{
u8 identity = GetBankIdentity(bank);
if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest())
u8 position = GetBattlerPosition(bank);
if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest())
toBG_2 = FALSE;
else
toBG_2 = TRUE;
@@ -652,20 +647,20 @@ static void ScriptCmd_monbg(void)
gAnimScriptCallback = WaitAnimFrameCount;
}
bool8 IsAnimBankSpriteVisible(u8 bank)
bool8 IsBattlerSpriteVisible(u8 bank)
{
if (IsContest())
{
if (bank == gAnimBankAttacker)
if (bank == gBattleAnimAttacker)
return TRUE;
else
return FALSE;
}
if (!IsBankSpritePresent(bank))
if (!IsBattlerSpritePresent(bank))
return FALSE;
if (IsContest())
return TRUE; // this line wont ever be reached.
if (!gBattleSpritesDataPtr->bankData[bank].invisible || !gSprites[gBankSpriteIds[bank]].invisible)
if (!gBattleSpritesDataPtr->battlerData[bank].invisible || !gSprites[gBattlerSpriteIds[bank]].invisible)
return TRUE;
return FALSE;
@@ -699,7 +694,7 @@ void sub_80A438C(u8 bank, bool8 toBG_2, bool8 setSpriteInvisible)
SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 1);
SetAnimBgAttribute(1, BG_ANIM_AREA_OVERFLOW_MODE, 0);
bankSpriteId = gBankSpriteIds[bank];
bankSpriteId = gBattlerSpriteIds[bank];
gBattle_BG1_X = -(gSprites[bankSpriteId].pos1.x + gSprites[bankSpriteId].pos2.x) + 0x20;
if (IsContest() && IsSpeciesNotUnown(gContestResources->field_18->field_0))
@@ -707,7 +702,7 @@ void sub_80A438C(u8 bank, bool8 toBG_2, bool8 setSpriteInvisible)
gBattle_BG1_Y = -(gSprites[bankSpriteId].pos1.y + gSprites[bankSpriteId].pos2.y) + 0x20;
if (setSpriteInvisible)
gSprites[gBankSpriteIds[bank]].invisible = 1;
gSprites[gBattlerSpriteIds[bank]].invisible = 1;
SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X);
SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y);
@@ -718,7 +713,7 @@ void sub_80A438C(u8 bank, bool8 toBG_2, bool8 setSpriteInvisible)
if (IsContest())
bankIdentity = 0;
else
bankIdentity = GetBankIdentity(bank);
bankIdentity = GetBattlerPosition(bank);
sub_8118FBC(1, 0, 0, bankIdentity, unknownStruct.unk8, unknownStruct.unk0, unknownStruct.unk4, unknownStruct.unkA);
@@ -736,13 +731,13 @@ void sub_80A438C(u8 bank, bool8 toBG_2, bool8 setSpriteInvisible)
SetAnimBgAttribute(2, BG_ANIM_SCREEN_SIZE, 1);
SetAnimBgAttribute(2, BG_ANIM_AREA_OVERFLOW_MODE, 0);
bankSpriteId = gBankSpriteIds[bank];
bankSpriteId = gBattlerSpriteIds[bank];
gBattle_BG2_X = -(gSprites[bankSpriteId].pos1.x + gSprites[bankSpriteId].pos2.x) + 0x20;
gBattle_BG2_Y = -(gSprites[bankSpriteId].pos1.y + gSprites[bankSpriteId].pos2.y) + 0x20;
if (setSpriteInvisible)
gSprites[gBankSpriteIds[bank]].invisible = 1;
gSprites[gBattlerSpriteIds[bank]].invisible = 1;
SetGpuReg(REG_OFFSET_BG2HOFS, gBattle_BG2_X);
SetGpuReg(REG_OFFSET_BG2VOFS, gBattle_BG2_Y);
@@ -750,7 +745,7 @@ void sub_80A438C(u8 bank, bool8 toBG_2, bool8 setSpriteInvisible)
LoadPalette(&gPlttBufferUnfaded[0x100 + bank * 16], 0x90, 0x20);
CpuCopy32(&gPlttBufferUnfaded[0x100 + bank * 16], (void*)(BG_PLTT + 0x120), 0x20);
sub_8118FBC(2, 0, 0, GetBankIdentity(bank), unknownStruct.unk8, unknownStruct.unk0 + 0x1000, unknownStruct.unk4 + 0x400, unknownStruct.unkA);
sub_8118FBC(2, 0, 0, GetBattlerPosition(bank), unknownStruct.unk8, unknownStruct.unk0 + 0x1000, unknownStruct.unk4 + 0x400, unknownStruct.unkA);
}
}
@@ -869,14 +864,14 @@ static void ScriptCmd_clearmonbg(void)
animBankId = ANIM_DEF_PARTNER;
if (animBankId == ANIM_ATTACKER || animBankId == ANIM_ATK_PARTNER)
bank = gAnimBankAttacker;
bank = gBattleAnimAttacker;
else
bank = gAnimBankTarget;
bank = gBattleAnimTarget;
if (sMonAnimTaskIdArray[0] != 0xFF)
gSprites[gBankSpriteIds[bank]].invisible = 0;
gSprites[gBattlerSpriteIds[bank]].invisible = 0;
if (animBankId > 1 && sMonAnimTaskIdArray[1] != 0xFF)
gSprites[gBankSpriteIds[bank ^ BIT_MON]].invisible = 0;
gSprites[gBattlerSpriteIds[bank ^ BIT_FLANK]].invisible = 0;
else
animBankId = 0;
@@ -893,8 +888,8 @@ static void sub_80A4980(u8 taskId)
if (gTasks[taskId].data[1] != 1)
{
u8 to_BG2;
u8 identity = GetBankIdentity(gTasks[taskId].data[2]);
if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest())
u8 position = GetBattlerPosition(gTasks[taskId].data[2]);
if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest())
to_BG2 = FALSE;
else
to_BG2 = TRUE;
@@ -931,14 +926,14 @@ static void ScriptCmd_monbg_22(void)
animBankId = ANIM_DEF_PARTNER;
if (animBankId == ANIM_ATTACKER || animBankId == ANIM_ATK_PARTNER)
bank = gAnimBankAttacker;
bank = gBattleAnimAttacker;
else
bank = gAnimBankTarget;
bank = gBattleAnimTarget;
if (IsAnimBankSpriteVisible(bank))
if (IsBattlerSpriteVisible(bank))
{
u8 identity = GetBankIdentity(bank);
if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest())
u8 position = GetBattlerPosition(bank);
if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest())
toBG_2 = FALSE;
else
toBG_2 = TRUE;
@@ -946,11 +941,11 @@ static void ScriptCmd_monbg_22(void)
sub_80A438C(bank, toBG_2, FALSE);
}
bank ^= BIT_MON;
if (animBankId > 1 && IsAnimBankSpriteVisible(bank))
bank ^= BIT_FLANK;
if (animBankId > 1 && IsBattlerSpriteVisible(bank))
{
u8 identity = GetBankIdentity(bank);
if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest())
u8 position = GetBattlerPosition(bank);
if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest())
toBG_2 = FALSE;
else
toBG_2 = TRUE;
@@ -976,14 +971,14 @@ static void ScriptCmd_clearmonbg_23(void)
animBankId = ANIM_DEF_PARTNER;
if (animBankId == ANIM_ATTACKER || animBankId == ANIM_ATK_PARTNER)
bank = gAnimBankAttacker;
bank = gBattleAnimAttacker;
else
bank = gAnimBankTarget;
bank = gBattleAnimTarget;
if (IsAnimBankSpriteVisible(bank))
gSprites[gBankSpriteIds[bank]].invisible = 0;
if (animBankId > 1 && IsAnimBankSpriteVisible(bank ^ BIT_MON))
gSprites[gBankSpriteIds[bank ^ BIT_MON]].invisible = 0;
if (IsBattlerSpriteVisible(bank))
gSprites[gBattlerSpriteIds[bank]].invisible = 0;
if (animBankId > 1 && IsBattlerSpriteVisible(bank ^ BIT_FLANK))
gSprites[gBattlerSpriteIds[bank ^ BIT_FLANK]].invisible = 0;
else
animBankId = 0;
@@ -1001,15 +996,15 @@ static void sub_80A4BB0(u8 taskId)
{
bool8 toBG_2;
u8 bank = gTasks[taskId].data[2];
u8 identity = GetBankIdentity(bank);
if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest())
u8 position = GetBattlerPosition(bank);
if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest())
toBG_2 = FALSE;
else
toBG_2 = TRUE;
if (IsAnimBankSpriteVisible(bank))
if (IsBattlerSpriteVisible(bank))
sub_80A477C(toBG_2);
if (gTasks[taskId].data[0] > 1 && IsAnimBankSpriteVisible(bank ^ BIT_MON))
if (gTasks[taskId].data[0] > 1 && IsBattlerSpriteVisible(bank ^ BIT_FLANK))
sub_80A477C(toBG_2 ^ 1);
DestroyTask(taskId);
@@ -1145,7 +1140,7 @@ static void ScriptCmd_fadetobgfromset(void)
if (IsContest())
gTasks[taskId].tBackgroundId = bg3;
else if (GetBankSide(gAnimBankTarget) == SIDE_PLAYER)
else if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
gTasks[taskId].tBackgroundId = bg2;
else
gTasks[taskId].tBackgroundId = bg1;
@@ -1270,21 +1265,21 @@ static void ScriptCmd_changebg(void)
s8 BattleAnimAdjustPanning(s8 pan)
{
if (!IsContest() && gBattleSpritesDataPtr->healthBoxesData[gAnimBankAttacker].statusAnimActive)
if (!IsContest() && gBattleSpritesDataPtr->healthBoxesData[gBattleAnimAttacker].statusAnimActive)
{
if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER)
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
pan = PAN_SIDE_OPPONENT;
else
pan = PAN_SIDE_PLAYER;
}
else if (IsContest())
{
if (gAnimBankAttacker != gAnimBankTarget || gAnimBankAttacker != 2 || pan != PAN_SIDE_OPPONENT)
if (gBattleAnimAttacker != gBattleAnimTarget || gBattleAnimAttacker != 2 || pan != PAN_SIDE_OPPONENT)
pan *= -1;
}
else if (GetBankSide(gAnimBankAttacker) == SIDE_PLAYER)
else if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
{
if (GetBankSide(gAnimBankTarget) == SIDE_PLAYER)
if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
{
if (pan == PAN_SIDE_OPPONENT)
pan = PAN_SIDE_PLAYER;
@@ -1292,7 +1287,7 @@ s8 BattleAnimAdjustPanning(s8 pan)
pan *= -1;
}
}
else if (GetBankSide(gAnimBankTarget) == SIDE_OPPONENT)
else if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_OPPONENT)
{
if (pan == PAN_SIDE_PLAYER)
pan = PAN_SIDE_OPPONENT;
@@ -1312,16 +1307,16 @@ s8 BattleAnimAdjustPanning(s8 pan)
s8 BattleAnimAdjustPanning2(s8 pan)
{
if (!IsContest() && gBattleSpritesDataPtr->healthBoxesData[gAnimBankAttacker].statusAnimActive)
if (!IsContest() && gBattleSpritesDataPtr->healthBoxesData[gBattleAnimAttacker].statusAnimActive)
{
if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER)
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
pan = PAN_SIDE_OPPONENT;
else
pan = PAN_SIDE_PLAYER;
}
else
{
if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER || IsContest())
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER || IsContest())
pan = -pan;
}
return pan;
@@ -1701,12 +1696,12 @@ static void ScriptCmd_monbgprio_28(void)
sBattleAnimScriptPtr += 2;
if (wantedBank != ANIM_ATTACKER)
bank = gAnimBankTarget;
bank = gBattleAnimTarget;
else
bank = gAnimBankAttacker;
bank = gBattleAnimAttacker;
bankIdentity = GetBankIdentity(bank);
if (!IsContest() && (bankIdentity == IDENTITY_PLAYER_MON1 || bankIdentity == IDENTITY_OPPONENT_MON2))
bankIdentity = GetBattlerPosition(bank);
if (!IsContest() && (bankIdentity == B_POSITION_PLAYER_LEFT || bankIdentity == B_POSITION_OPPONENT_RIGHT))
{
SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2);
@@ -1731,15 +1726,15 @@ static void ScriptCmd_monbgprio_2A(void)
wantedBank = sBattleAnimScriptPtr[1];
sBattleAnimScriptPtr += 2;
if (GetBankSide(gAnimBankAttacker) != GetBankSide(gAnimBankTarget))
if (GetBattlerSide(gBattleAnimAttacker) != GetBattlerSide(gBattleAnimTarget))
{
if (wantedBank != ANIM_ATTACKER)
bank = gAnimBankTarget;
bank = gBattleAnimTarget;
else
bank = gAnimBankAttacker;
bank = gBattleAnimAttacker;
bankIdentity = GetBankIdentity(bank);
if (!IsContest() && (bankIdentity == IDENTITY_PLAYER_MON1 || bankIdentity == IDENTITY_OPPONENT_MON2))
bankIdentity = GetBattlerPosition(bank);
if (!IsContest() && (bankIdentity == B_POSITION_PLAYER_LEFT || bankIdentity == B_POSITION_OPPONENT_RIGHT))
{
SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2);
@@ -1751,7 +1746,7 @@ static void ScriptCmd_invisible(void)
{
u8 spriteId;
spriteId = GetAnimBankSpriteId(sBattleAnimScriptPtr[1]);
spriteId = GetAnimBattlerSpriteId(sBattleAnimScriptPtr[1]);
if (spriteId != 0xFF)
gSprites[spriteId].invisible = 1;
@@ -1762,7 +1757,7 @@ static void ScriptCmd_visible(void)
{
u8 spriteId;
spriteId = GetAnimBankSpriteId(sBattleAnimScriptPtr[1]);
spriteId = GetAnimBattlerSpriteId(sBattleAnimScriptPtr[1]);
if (spriteId != 0xFF)
gSprites[spriteId].invisible = 0;
@@ -1778,17 +1773,17 @@ static void ScriptCmd_doublebattle_2D(void)
wantedBank = sBattleAnimScriptPtr[1];
sBattleAnimScriptPtr += 2;
if (!IsContest() && IsDoubleBattle()
&& GetBankSide(gAnimBankAttacker) == GetBankSide(gAnimBankTarget))
&& GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))
{
if (wantedBank == ANIM_ATTACKER)
{
r4 = sub_80A8364(gAnimBankAttacker);
spriteId = GetAnimBankSpriteId(ANIM_ATTACKER);
r4 = sub_80A8364(gBattleAnimAttacker);
spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
}
else
{
r4 = sub_80A8364(gAnimBankTarget);
spriteId = GetAnimBankSpriteId(ANIM_TARGET);
r4 = sub_80A8364(gBattleAnimTarget);
spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);
}
if (spriteId != 0xFF)
{
@@ -1813,17 +1808,17 @@ static void ScriptCmd_doublebattle_2E(void)
wantedBank = sBattleAnimScriptPtr[1];
sBattleAnimScriptPtr += 2;
if (!IsContest() && IsDoubleBattle()
&& GetBankSide(gAnimBankAttacker) == GetBankSide(gAnimBankTarget))
&& GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))
{
if (wantedBank == ANIM_ATTACKER)
{
r4 = sub_80A8364(gAnimBankAttacker);
spriteId = GetAnimBankSpriteId(ANIM_ATTACKER);
r4 = sub_80A8364(gBattleAnimAttacker);
spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
}
else
{
r4 = sub_80A8364(gAnimBankTarget);
spriteId = GetAnimBankSpriteId(ANIM_TARGET);
r4 = sub_80A8364(gBattleAnimTarget);
spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);
}
if (spriteId != 0xFF && r4 == 2)
+6 -8
View File
@@ -17,7 +17,8 @@
#include "strings.h"
#include "window.h"
#include "text_window.h"
#include "new_menu_helpers.h"
#include "menu.h"
#include "battle_setup.h"
struct BattleBackground
{
@@ -35,13 +36,10 @@ extern const struct BgTemplate gUnknown_0831AA08[4];
extern const struct WindowTemplate *gUnknown_0831ABA0[];
extern const struct BattleBackground gBattleTerrainTable[];
extern u8 gBattleTerrain;
extern u16 gTrainerBattleOpponent_A;
extern u16 gBattle_BG1_X;
extern u16 gBattle_BG1_Y;
extern u16 gBattle_BG2_X;
extern u16 gBattle_BG2_Y;
extern u16 gPartnerTrainerId;
extern u8 GetCurrentMapBattleScene(void);
@@ -273,13 +271,13 @@ static void sub_8035AE4(u8 taskId, u8 bank, u8 bgId, u8 destX, u8 destY)
static void sub_8035C4C(void)
{
if (gBattleOutcome == BATTLE_DREW)
if (gBattleOutcome == B_OUTCOME_DREW)
{
BattleHandleAddTextPrinter(gText_Draw, 0x15);
}
else if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
if (gBattleOutcome == BATTLE_WON)
if (gBattleOutcome == B_OUTCOME_WON)
{
switch (gLinkPlayers[gBattleScripting.multiplayerId].lp_field_18)
{
@@ -324,7 +322,7 @@ static void sub_8035C4C(void)
}
}
}
else if (gBattleOutcome == BATTLE_WON)
else if (gBattleOutcome == B_OUTCOME_WON)
{
if (gLinkPlayers[gBattleScripting.multiplayerId].lp_field_18 != 0)
{
@@ -363,7 +361,7 @@ void sub_8035D74(u8 taskId)
case 0:
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
for (i = 0; i < BATTLE_BANKS_COUNT; i++)
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
name = gLinkPlayers[i].name;
linkPlayer = &gLinkPlayers[i];
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+77 -92
View File
@@ -21,27 +21,12 @@
#include "pokeball.h"
#include "data2.h"
#include "pokeblock.h"
#include "item_use.h"
extern u32 gBattleExecBuffer;
extern u8 gActiveBank;
extern u8 gBankSpriteIds[BATTLE_BANKS_COUNT];
extern u8 gActionSelectionCursor[BATTLE_BANKS_COUNT];
extern u8 gNoOfAllBanks;
extern bool8 gDoingBattleAnim;
extern void (*gBattleBankFunc[BATTLE_BANKS_COUNT])(void);
extern void (*gPreBattleCallback1)(void);
extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
extern u8 gBattleBufferA[BATTLE_BANKS_COUNT][0x200];
extern u8 gBattleBufferB[BATTLE_BANKS_COUNT][0x200];
extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT];
extern struct BattlePokemon gBattleMons[MAX_BATTLERS_COUNT];
extern struct SpriteTemplate gUnknown_0202499C;
extern u16 gSpecialVar_ItemId;
extern u8 gHealthBoxesIds[BATTLE_BANKS_COUNT];
extern u8 gBattleOutcome;
extern u16 gBattle_BG0_X;
extern u16 gBattle_BG0_Y;
extern u8 gBankInMenu;
extern u16 gUnknown_020243FC;
extern const struct CompressedSpritePalette gTrainerBackPicPaletteTable[];
@@ -180,15 +165,15 @@ static void nullsub_114(void)
void SetControllerToSafari(void)
{
gBattleBankFunc[gActiveBank] = SafariBufferRunCommand;
gBattlerControllerFuncs[gActiveBattler] = SafariBufferRunCommand;
}
static void SafariBufferRunCommand(void)
{
if (gBattleExecBuffer & gBitTable[gActiveBank])
if (gBattleControllerExecFlags & gBitTable[gActiveBattler])
{
if (gBattleBufferA[gActiveBank][0] < ARRAY_COUNT(sSafariBufferCommands))
sSafariBufferCommands[gBattleBufferA[gActiveBank][0]]();
if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sSafariBufferCommands))
sSafariBufferCommands[gBattleBufferA[gActiveBattler][0]]();
else
SafariBufferExecCompleted();
}
@@ -200,68 +185,68 @@ static void HandleInputChooseAction(void)
{
PlaySE(SE_SELECT);
switch (gActionSelectionCursor[gActiveBank])
switch (gActionSelectionCursor[gActiveBattler])
{
case 0:
EmitTwoReturnValues(1, ACTION_SAFARI_ZONE_BALL, 0);
BtlController_EmitTwoReturnValues(1, B_ACTION_SAFARI_BALL, 0);
break;
case 1:
EmitTwoReturnValues(1, ACTION_POKEBLOCK_CASE, 0);
BtlController_EmitTwoReturnValues(1, B_ACTION_SAFARI_POKEBLOCK, 0);
break;
case 2:
EmitTwoReturnValues(1, ACTION_GO_NEAR, 0);
BtlController_EmitTwoReturnValues(1, B_ACTION_SAFARI_GO_NEAR, 0);
break;
case 3:
EmitTwoReturnValues(1, ACTION_SAFARI_ZONE_RUN, 0);
BtlController_EmitTwoReturnValues(1, B_ACTION_SAFARI_RUN, 0);
break;
}
SafariBufferExecCompleted();
}
else if (gMain.newKeys & DPAD_LEFT)
{
if (gActionSelectionCursor[gActiveBank] & 1)
if (gActionSelectionCursor[gActiveBattler] & 1)
{
PlaySE(SE_SELECT);
ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBank]);
gActionSelectionCursor[gActiveBank] ^= 1;
ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBank], 0);
ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);
gActionSelectionCursor[gActiveBattler] ^= 1;
ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);
}
}
else if (gMain.newKeys & DPAD_RIGHT)
{
if (!(gActionSelectionCursor[gActiveBank] & 1))
if (!(gActionSelectionCursor[gActiveBattler] & 1))
{
PlaySE(SE_SELECT);
ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBank]);
gActionSelectionCursor[gActiveBank] ^= 1;
ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBank], 0);
ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);
gActionSelectionCursor[gActiveBattler] ^= 1;
ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);
}
}
else if (gMain.newKeys & DPAD_UP)
{
if (gActionSelectionCursor[gActiveBank] & 2)
if (gActionSelectionCursor[gActiveBattler] & 2)
{
PlaySE(SE_SELECT);
ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBank]);
gActionSelectionCursor[gActiveBank] ^= 2;
ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBank], 0);
ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);
gActionSelectionCursor[gActiveBattler] ^= 2;
ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);
}
}
else if (gMain.newKeys & DPAD_DOWN)
{
if (!(gActionSelectionCursor[gActiveBank] & 2))
if (!(gActionSelectionCursor[gActiveBattler] & 2))
{
PlaySE(SE_SELECT);
ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBank]);
gActionSelectionCursor[gActiveBank] ^= 2;
ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBank], 0);
ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);
gActionSelectionCursor[gActiveBattler] ^= 2;
ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);
}
}
}
static void CompleteOnBankSpriteCallbackDummy(void)
{
if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
SafariBufferExecCompleted();
}
@@ -273,7 +258,7 @@ static void CompleteOnInactiveTextPrinter(void)
static void CompleteOnHealthboxSpriteCallbackDummy(void)
{
if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy)
if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
SafariBufferExecCompleted();
}
@@ -289,7 +274,7 @@ static void sub_81595E4(void)
static void CompleteOnSpecialAnimDone(void)
{
if (!gDoingBattleAnim || !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
if (!gDoingBattleAnim || !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
SafariBufferExecCompleted();
}
@@ -297,7 +282,7 @@ static void SafariOpenPokeblockCase(void)
{
if (!gPaletteFade.active)
{
gBattleBankFunc[gActiveBank] = CompleteWhenChosePokeblock;
gBattlerControllerFuncs[gActiveBattler] = CompleteWhenChosePokeblock;
FreeAllWindowBuffers();
OpenPokeblockCaseInBattle();
}
@@ -307,36 +292,36 @@ static void CompleteWhenChosePokeblock(void)
{
if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active)
{
EmitOneReturnValue(1, gSpecialVar_ItemId);
BtlController_EmitOneReturnValue(1, gSpecialVar_ItemId);
SafariBufferExecCompleted();
}
}
static void CompleteOnFinishedBattleAnimation(void)
{
if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animFromTableActive)
if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive)
SafariBufferExecCompleted();
}
static void SafariBufferExecCompleted(void)
{
gBattleBankFunc[gActiveBank] = SafariBufferRunCommand;
gBattlerControllerFuncs[gActiveBattler] = SafariBufferRunCommand;
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
u8 playerId = GetMultiplayerId();
PrepareBufferDataTransferLink(2, 4, &playerId);
gBattleBufferA[gActiveBank][0] = CONTROLLER_TERMINATOR_NOP;
gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP;
}
else
{
gBattleExecBuffer &= ~gBitTable[gActiveBank];
gBattleControllerExecFlags &= ~gBitTable[gActiveBattler];
}
}
static void CompleteOnFinishedStatusAnimation(void)
{
if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].statusAnimActive)
if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive)
SafariBufferExecCompleted();
}
@@ -377,18 +362,18 @@ static void SafariHandleReturnMonToBall(void)
static void SafariHandleDrawTrainerPic(void)
{
DecompressTrainerBackPic(gSaveBlock2Ptr->playerGender, gActiveBank);
sub_806A12C(gSaveBlock2Ptr->playerGender, GetBankIdentity(gActiveBank));
gBankSpriteIds[gActiveBank] = CreateSprite(
DecompressTrainerBackPic(gSaveBlock2Ptr->playerGender, gActiveBattler);
sub_806A12C(gSaveBlock2Ptr->playerGender, GetBattlerPosition(gActiveBattler));
gBattlerSpriteIds[gActiveBattler] = CreateSprite(
&gUnknown_0202499C,
80,
(8 - gTrainerBackPicCoords[gSaveBlock2Ptr->playerGender].coords) * 4 + 80,
30);
gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank;
gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 240;
gSprites[gBankSpriteIds[gActiveBank]].data[0] = -2;
gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC;
gBattleBankFunc[gActiveBank] = CompleteOnBankSpriteCallbackDummy;
gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;
gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 240;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2;
gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC;
gBattlerControllerFuncs[gActiveBattler] = CompleteOnBankSpriteCallbackDummy;
}
static void SafariHandleTrainerSlide(void)
@@ -415,18 +400,18 @@ static void SafariHandleSuccessBallThrowAnim(void)
{
gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS;
gDoingBattleAnim = TRUE;
InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, GetBankByIdentity(IDENTITY_OPPONENT_MON1), B_ANIM_SAFARI_BALL_THROW);
gBattleBankFunc[gActiveBank] = CompleteOnSpecialAnimDone;
InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_SAFARI_BALL_THROW);
gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone;
}
static void SafariHandleBallThrowAnim(void)
{
u8 ballThrowCaseId = gBattleBufferA[gActiveBank][1];
u8 ballThrowCaseId = gBattleBufferA[gActiveBattler][1];
gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId;
gDoingBattleAnim = TRUE;
InitAndLaunchSpecialAnimation(gActiveBank, gActiveBank, GetBankByIdentity(IDENTITY_OPPONENT_MON1), B_ANIM_SAFARI_BALL_THROW);
gBattleBankFunc[gActiveBank] = CompleteOnSpecialAnimDone;
InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_SAFARI_BALL_THROW);
gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone;
}
static void SafariHandlePause(void)
@@ -445,15 +430,15 @@ static void SafariHandlePrintString(void)
gBattle_BG0_X = 0;
gBattle_BG0_Y = 0;
stringId = (u16*)(&gBattleBufferA[gActiveBank][2]);
stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]);
BufferStringBattle(*stringId);
BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
gBattleBankFunc[gActiveBank] = CompleteOnInactiveTextPrinter;
gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter;
}
static void SafariHandlePrintSelectionString(void)
{
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
SafariHandlePrintString();
else
SafariBufferExecCompleted();
@@ -465,7 +450,7 @@ static void HandleChooseActionAfterDma3(void)
{
gBattle_BG0_X = 0;
gBattle_BG0_Y = 160;
gBattleBankFunc[gActiveBank] = HandleInputChooseAction;
gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseAction;
}
}
@@ -473,13 +458,13 @@ static void SafariHandleChooseAction(void)
{
s32 i;
gBattleBankFunc[gActiveBank] = HandleChooseActionAfterDma3;
gBattlerControllerFuncs[gActiveBattler] = HandleChooseActionAfterDma3;
BattleHandleAddTextPrinter(gText_SafariZoneMenu, 2);
for (i = 0; i < 4; i++)
ActionSelectionDestroyCursorAt(i);
ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBank], 0);
ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);
BattleStringExpandPlaceholdersToDisplayedString(gText_WhatWillPkmnDo2);
BattleHandleAddTextPrinter(gDisplayedStringBattle, 1);
}
@@ -499,8 +484,8 @@ static void SafariHandleChooseItem(void)
s32 i;
BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
gBattleBankFunc[gActiveBank] = SafariOpenPokeblockCase;
gBankInMenu = gActiveBank;
gBattlerControllerFuncs[gActiveBattler] = SafariOpenPokeblockCase;
gBattlerInMenuId = gActiveBattler;
}
static void SafariHandleChoosePokemon(void)
@@ -525,7 +510,7 @@ static void SafariHandleExpUpdate(void)
static void SafariHandleStatusIconUpdate(void)
{
UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], HEALTHBOX_SAFARI_BALLS_TEXT);
UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_SAFARI_BALLS_TEXT);
SafariBufferExecCompleted();
}
@@ -613,25 +598,25 @@ static void SafariHandlePlaySE(void)
{
s8 pan;
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
pan = PAN_SIDE_PLAYER;
else
pan = PAN_SIDE_OPPONENT;
PlaySE12WithPanning(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8), pan);
PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan);
SafariBufferExecCompleted();
}
static void SafariHandlePlayFanfareOrBGM(void)
{
if (gBattleBufferA[gActiveBank][3])
if (gBattleBufferA[gActiveBattler][3])
{
BattleStopLowHpSound();
PlayBGM(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
PlayBGM(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
}
else
{
PlayFanfare(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
}
SafariBufferExecCompleted();
@@ -639,7 +624,7 @@ static void SafariHandlePlayFanfareOrBGM(void)
static void SafariHandleFaintingCry(void)
{
u16 species = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES);
u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);
PlayCry1(species, 25);
SafariBufferExecCompleted();
@@ -647,17 +632,17 @@ static void SafariHandleFaintingCry(void)
static void SafariHandleIntroSlide(void)
{
HandleIntroSlide(gBattleBufferA[gActiveBank][1]);
gUnknown_020243FC |= 1;
HandleIntroSlide(gBattleBufferA[gActiveBattler][1]);
gIntroSlideFlags |= 1;
SafariBufferExecCompleted();
}
static void SafariHandleIntroTrainerBallThrow(void)
{
UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], HEALTHBOX_SAFARI_ALL_TEXT);
sub_8076918(gActiveBank);
SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank]);
gBattleBankFunc[gActiveBank] = CompleteOnHealthboxSpriteCallbackDummy;
UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_SAFARI_ALL_TEXT);
sub_8076918(gActiveBattler);
SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthboxSpriteCallbackDummy;
}
static void SafariHandleDrawPartyStatusSummary(void)
@@ -682,13 +667,13 @@ static void SafariHandleSpriteInvisibility(void)
static void SafariHandleBattleAnimation(void)
{
u8 animationId = gBattleBufferA[gActiveBank][1];
u16 argument = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8);
u8 animationId = gBattleBufferA[gActiveBattler][1];
u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);
if (TryHandleLaunchBattleTableAnimation(gActiveBank, gActiveBank, gActiveBank, animationId, argument))
if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument))
SafariBufferExecCompleted();
else
gBattleBankFunc[gActiveBank] = CompleteOnFinishedBattleAnimation;
gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation;
}
static void SafariHandleLinkStandbyMsg(void)
@@ -703,12 +688,12 @@ static void SafariHandleResetActionMoveSelection(void)
static void SafariHandleCmd55(void)
{
gBattleOutcome = gBattleBufferA[gActiveBank][1];
gBattleOutcome = gBattleBufferA[gActiveBattler][1];
FadeOutMapMusic(5);
BeginFastPaletteFade(3);
SafariBufferExecCompleted();
if ((gBattleTypeFlags & BATTLE_TYPE_LINK) && !(gBattleTypeFlags & BATTLE_TYPE_WILD))
gBattleBankFunc[gActiveBank] = sub_81595E4;
gBattlerControllerFuncs[gActiveBattler] = sub_81595E4;
}
static void nullsub_115(void)
File diff suppressed because it is too large Load Diff
+275 -284
View File
File diff suppressed because it is too large Load Diff
+3 -3
View File
@@ -19,7 +19,7 @@ extern const union AffineAnimCmd *const gUnknown_082FF694[];
extern const union AnimCmd *const gUnknown_082FF70C[];
extern const union AnimCmd *const *const gMonAnimationsSpriteAnimsPtrTable[NUM_SPECIES];
extern const union AnimCmd *const *const gUnknown_0830536C[];
extern const u8 gUnknown_0831F578[];
extern const u8 gFacilityClassToPicIndex[];
// Static type declarations
@@ -421,9 +421,9 @@ u8 sub_818D97C(u8 a0, u8 a1)
switch (a0)
{
default:
return gUnknown_0831F578[0x3F];
return gFacilityClassToPicIndex[0x3F];
case 0:
return gUnknown_0831F578[0x3C];
return gFacilityClassToPicIndex[0x3C];
}
}
return a0;
+234 -243
View File
File diff suppressed because it is too large Load Diff
+82 -90
View File
@@ -153,11 +153,6 @@ enum
HEALTHBOX_GFX_117,
};
extern u8 gBanksByIdentity[BATTLE_BANKS_COUNT];
extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
extern u8 gNoOfAllBanks;
extern u8 gHealthBoxesIds[BATTLE_BANKS_COUNT];
extern const u8 * const gNatureNamePointers[];
extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1];
@@ -177,9 +172,6 @@ extern const u16 gBattleInterface_BallStatusBarPal[];
extern const u16 gBattleInterface_BallDisplayPal[];
extern const u8 gHealthboxElementsGfxTable[][32];
// functions
extern void LoadBattleBarGfx(u8 arg0);
// this file's functions
static const u8 *GetHealthboxElementGfxPtr(u8 elementId);
@@ -898,7 +890,7 @@ void sub_80724A8(s16 arg0, s16 arg1, u16 *arg2)
// healthboxSpriteId_2 refers to the other part
// there's also one other sprite that appears to be a black square? dont fully understand its role
u8 CreateBankHealthboxSprites(u8 bank)
u8 CreateBattlerHealthboxSprites(u8 battler)
{
s16 data6 = 0;
u8 healthboxSpriteId_1, healthboxSpriteId_2;
@@ -907,7 +899,7 @@ u8 CreateBankHealthboxSprites(u8 bank)
if (!IsDoubleBattle())
{
if (GetBankSide(bank) == SIDE_PLAYER)
if (GetBattlerSide(battler) == B_SIDE_PLAYER)
{
healthboxSpriteId_1 = CreateSprite(&sHealthboxPlayerSpriteTemplates[0], 240, 160, 1);
healthboxSpriteId_2 = CreateSpriteAtEnd(&sHealthboxPlayerSpriteTemplates[0], 240, 160, 1);
@@ -932,10 +924,10 @@ u8 CreateBankHealthboxSprites(u8 bank)
}
else
{
if (GetBankSide(bank) == SIDE_PLAYER)
if (GetBattlerSide(battler) == B_SIDE_PLAYER)
{
healthboxSpriteId_1 = CreateSprite(&sHealthboxPlayerSpriteTemplates[GetBankIdentity(bank) / 2], 240, 160, 1);
healthboxSpriteId_2 = CreateSpriteAtEnd(&sHealthboxPlayerSpriteTemplates[GetBankIdentity(bank) / 2], 240, 160, 1);
healthboxSpriteId_1 = CreateSprite(&sHealthboxPlayerSpriteTemplates[GetBattlerPosition(battler) / 2], 240, 160, 1);
healthboxSpriteId_2 = CreateSpriteAtEnd(&sHealthboxPlayerSpriteTemplates[GetBattlerPosition(battler) / 2], 240, 160, 1);
gSprites[healthboxSpriteId_1].oam.affineParam = healthboxSpriteId_2;
@@ -947,8 +939,8 @@ u8 CreateBankHealthboxSprites(u8 bank)
}
else
{
healthboxSpriteId_1 = CreateSprite(&sHealthboxOpponentSpriteTemplates[GetBankIdentity(bank) / 2], 240, 160, 1);
healthboxSpriteId_2 = CreateSpriteAtEnd(&sHealthboxOpponentSpriteTemplates[GetBankIdentity(bank) / 2], 240, 160, 1);
healthboxSpriteId_1 = CreateSprite(&sHealthboxOpponentSpriteTemplates[GetBattlerPosition(battler) / 2], 240, 160, 1);
healthboxSpriteId_2 = CreateSpriteAtEnd(&sHealthboxOpponentSpriteTemplates[GetBattlerPosition(battler) / 2], 240, 160, 1);
gSprites[healthboxSpriteId_1].oam.affineParam = healthboxSpriteId_2;
@@ -960,16 +952,16 @@ u8 CreateBankHealthboxSprites(u8 bank)
}
}
unkSpriteId = CreateSpriteAtEnd(&sUnknown_0832C1C0[gBanksByIdentity[bank]], 140, 60, 0);
unkSpriteId = CreateSpriteAtEnd(&sUnknown_0832C1C0[gBattlerPositions[battler]], 140, 60, 0);
unkSpritePtr = &gSprites[unkSpriteId];
SetSubspriteTables(unkSpritePtr, &sUnknown_0832C28C[GetBankSide(bank)]);
SetSubspriteTables(unkSpritePtr, &sUnknown_0832C28C[GetBattlerSide(battler)]);
unkSpritePtr->subspriteMode = 2;
unkSpritePtr->oam.priority = 1;
CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_1), (void*)(OBJ_VRAM0 + unkSpritePtr->oam.tileNum * 32), 64);
gSprites[healthboxSpriteId_1].data[5] = unkSpriteId;
gSprites[healthboxSpriteId_1].data[6] = bank;
gSprites[healthboxSpriteId_1].data[6] = battler;
gSprites[healthboxSpriteId_1].invisible = 1;
gSprites[healthboxSpriteId_2].invisible = 1;
@@ -1087,11 +1079,11 @@ void UpdateOamPriorityInAllHealthboxes(u8 priority)
{
s32 i;
for (i = 0; i < gNoOfAllBanks; i++)
for (i = 0; i < gBattlersCount; i++)
{
u8 healthboxSpriteId_1 = gHealthBoxesIds[i];
u8 healthboxSpriteId_2 = gSprites[gHealthBoxesIds[i]].oam.affineParam;
u8 healthboxSpriteId_3 = gSprites[gHealthBoxesIds[i]].data[5];
u8 healthboxSpriteId_1 = gHealthboxSpriteIds[i];
u8 healthboxSpriteId_2 = gSprites[gHealthboxSpriteIds[i]].oam.affineParam;
u8 healthboxSpriteId_3 = gSprites[gHealthboxSpriteIds[i]].data[5];
gSprites[healthboxSpriteId_1].oam.priority = priority;
gSprites[healthboxSpriteId_2].oam.priority = priority;
@@ -1099,37 +1091,37 @@ void UpdateOamPriorityInAllHealthboxes(u8 priority)
}
}
void SetBankHealthboxSpritePos(u8 bank)
void InitBattlerHealthboxCoords(u8 battler)
{
s16 x = 0, y = 0;
if (!IsDoubleBattle())
{
if (GetBankSide(bank) != SIDE_PLAYER)
if (GetBattlerSide(battler) != B_SIDE_PLAYER)
x = 44, y = 30;
else
x = 158, y = 88;
}
else
{
switch (GetBankIdentity(bank))
switch (GetBattlerPosition(battler))
{
case IDENTITY_PLAYER_MON1:
case B_POSITION_PLAYER_LEFT:
x = 159, y = 76;
break;
case IDENTITY_PLAYER_MON2:
case B_POSITION_PLAYER_RIGHT:
x = 171, y = 101;
break;
case IDENTITY_OPPONENT_MON1:
case B_POSITION_OPPONENT_LEFT:
x = 44, y = 19;
break;
case IDENTITY_OPPONENT_MON2:
case B_POSITION_OPPONENT_RIGHT:
x = 32, y = 44;
break;
}
}
UpdateSpritePos(gHealthBoxesIds[bank], x, y);
UpdateSpritePos(gHealthboxSpriteIds[battler], x, y);
}
static void UpdateLvlInHealthbox(u8 healthboxSpriteId, u8 lvl)
@@ -1156,7 +1148,7 @@ static void UpdateLvlInHealthbox(u8 healthboxSpriteId, u8 lvl)
windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, xPos, 3, 2, &windowId);
spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32;
if (GetBankSide(gSprites[healthboxSpriteId].data[6]) == SIDE_PLAYER)
if (GetBattlerSide(gSprites[healthboxSpriteId].data[6]) == B_SIDE_PLAYER)
{
objVram = (void*)(OBJ_VRAM0);
if (!IsDoubleBattle())
@@ -1180,7 +1172,7 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent)
u8 text[32];
void *objVram;
if (GetBankSide(gSprites[healthboxSpriteId].data[6]) == SIDE_PLAYER && !IsDoubleBattle())
if (GetBattlerSide(gSprites[healthboxSpriteId].data[6]) == B_SIDE_PLAYER && !IsDoubleBattle())
{
spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32;
if (maxOrCurrent != HP_CURRENT) // singles, max
@@ -1210,11 +1202,11 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent)
}
else
{
u8 bank;
u8 battler;
memcpy(text, sUnknown_0832C3C4, sizeof(sUnknown_0832C3C4));
bank = gSprites[healthboxSpriteId].data[6];
if (IsDoubleBattle() == TRUE || GetBankSide(bank) == SIDE_OPPONENT)
battler = gSprites[healthboxSpriteId].data[6];
if (IsDoubleBattle() == TRUE || GetBattlerSide(battler) == B_SIDE_OPPONENT)
{
UpdateHpTextInHealthboxInDoubles(healthboxSpriteId, value, maxOrCurrent);
}
@@ -1223,7 +1215,7 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent)
u32 var;
u8 i;
if (GetBankSide(gSprites[healthboxSpriteId].data[6]) == SIDE_PLAYER)
if (GetBattlerSide(gSprites[healthboxSpriteId].data[6]) == B_SIDE_PLAYER)
{
if (maxOrCurrent == HP_CURRENT)
var = 29;
@@ -1258,9 +1250,9 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8
u8 text[32];
void *objVram;
if (GetBankSide(gSprites[healthboxSpriteId].data[6]) == SIDE_PLAYER)
if (GetBattlerSide(gSprites[healthboxSpriteId].data[6]) == B_SIDE_PLAYER)
{
if (gBattleSpritesDataPtr->bankData[gSprites[healthboxSpriteId].data[6]].hpNumbersNoBars) // don't print text if only bars are visible
if (gBattleSpritesDataPtr->battlerData[gSprites[healthboxSpriteId].data[6]].hpNumbersNoBars) // don't print text if only bars are visible
{
spriteTileNum = gSprites[gSprites[healthboxSpriteId].data[5]].oam.tileNum * 32;
objVram = (void*)(OBJ_VRAM0) + spriteTileNum;
@@ -1294,7 +1286,7 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8
memcpy(text, sUnknown_0832C3D8, sizeof(sUnknown_0832C3D8));
bank = gSprites[healthboxSpriteId].data[6];
if (gBattleSpritesDataPtr->bankData[bank].hpNumbersNoBars) // don't print text if only bars are visible
if (gBattleSpritesDataPtr->battlerData[bank].hpNumbersNoBars) // don't print text if only bars are visible
{
u8 var = 4;
u8 r7;
@@ -1335,7 +1327,7 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8
}
else
{
if (GetBankSide(bank) == SIDE_PLAYER) // impossible to reach part, because the bank is from the opponent's side
if (GetBattlerSide(bank) == B_SIDE_PLAYER) // impossible to reach part, because the bank is from the opponent's side
{
CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_116),
(void*)(OBJ_VRAM0) + ((gSprites[healthboxSpriteId].oam.tileNum + 52) * 32),
@@ -1354,7 +1346,7 @@ static void sub_80730D4(u8 healthboxSpriteId, struct Pokemon *mon)
u8 i, var, nature, healthboxSpriteId_2;
memcpy(text, sUnknown_0832C3C4, sizeof(sUnknown_0832C3C4));
barFontGfx = &gMonSpritesGfxPtr->barFontGfx[0x520 + (GetBankIdentity(gSprites[healthboxSpriteId].data[6]) * 384)];
barFontGfx = &gMonSpritesGfxPtr->barFontGfx[0x520 + (GetBattlerPosition(gSprites[healthboxSpriteId].data[6]) * 384)];
var = 5;
nature = GetNature(mon);
StringCopy(text + 6, gNatureNamePointers[nature]);
@@ -1415,17 +1407,17 @@ void SwapHpBarsWithHpText(void)
s32 i;
u8 spriteId;
for (i = 0; i < gNoOfAllBanks; i++)
for (i = 0; i < gBattlersCount; i++)
{
if (gSprites[gHealthBoxesIds[i]].callback == SpriteCallbackDummy
&& GetBankSide(i) != SIDE_OPPONENT
&& (IsDoubleBattle() || GetBankSide(i) != SIDE_PLAYER))
if (gSprites[gHealthboxSpriteIds[i]].callback == SpriteCallbackDummy
&& GetBattlerSide(i) != B_SIDE_OPPONENT
&& (IsDoubleBattle() || GetBattlerSide(i) != B_SIDE_PLAYER))
{
bool8 noBars;
gBattleSpritesDataPtr->bankData[i].hpNumbersNoBars ^= 1;
noBars = gBattleSpritesDataPtr->bankData[i].hpNumbersNoBars;
if (GetBankSide(i) == SIDE_PLAYER)
gBattleSpritesDataPtr->battlerData[i].hpNumbersNoBars ^= 1;
noBars = gBattleSpritesDataPtr->battlerData[i].hpNumbersNoBars;
if (GetBattlerSide(i) == B_SIDE_PLAYER)
{
if (!IsDoubleBattle())
continue;
@@ -1434,17 +1426,17 @@ void SwapHpBarsWithHpText(void)
if (noBars == TRUE) // bars to text
{
spriteId = gSprites[gHealthBoxesIds[i]].data[5];
spriteId = gSprites[gHealthboxSpriteIds[i]].data[5];
CpuFill32(0, (void*)(OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * 32), 0x100);
UpdateHpTextInHealthboxInDoubles(gHealthBoxesIds[i], GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_HP), HP_CURRENT);
UpdateHpTextInHealthboxInDoubles(gHealthBoxesIds[i], GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_MAX_HP), HP_MAX);
UpdateHpTextInHealthboxInDoubles(gHealthboxSpriteIds[i], GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_HP), HP_CURRENT);
UpdateHpTextInHealthboxInDoubles(gHealthboxSpriteIds[i], GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_MAX_HP), HP_MAX);
}
else // text to bars
{
UpdateStatusIconInHealthbox(gHealthBoxesIds[i]);
UpdateHealthboxAttribute(gHealthBoxesIds[i], &gPlayerParty[gBattlePartyID[i]], HEALTHBOX_HEALTH_BAR);
CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_117), (void*)(OBJ_VRAM0 + 0x680 + gSprites[gHealthBoxesIds[i]].oam.tileNum * 32), 32);
UpdateStatusIconInHealthbox(gHealthboxSpriteIds[i]);
UpdateHealthboxAttribute(gHealthboxSpriteIds[i], &gPlayerParty[gBattlerPartyIndexes[i]], HEALTHBOX_HEALTH_BAR);
CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_117), (void*)(OBJ_VRAM0 + 0x680 + gSprites[gHealthboxSpriteIds[i]].oam.tileNum * 32), 32);
}
}
else
@@ -1453,26 +1445,26 @@ void SwapHpBarsWithHpText(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
{
sub_80730D4(gHealthBoxesIds[i], &gEnemyParty[gBattlePartyID[i]]);
sub_80730D4(gHealthboxSpriteIds[i], &gEnemyParty[gBattlerPartyIndexes[i]]);
}
else
{
spriteId = gSprites[gHealthBoxesIds[i]].data[5];
spriteId = gSprites[gHealthboxSpriteIds[i]].data[5];
CpuFill32(0, (void *)(OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * 32), 0x100);
UpdateHpTextInHealthboxInDoubles(gHealthBoxesIds[i], GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_HP), HP_CURRENT);
UpdateHpTextInHealthboxInDoubles(gHealthBoxesIds[i], GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_MAX_HP), HP_MAX);
UpdateHpTextInHealthboxInDoubles(gHealthboxSpriteIds[i], GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_HP), HP_CURRENT);
UpdateHpTextInHealthboxInDoubles(gHealthboxSpriteIds[i], GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_MAX_HP), HP_MAX);
}
}
else // text to bars
{
UpdateStatusIconInHealthbox(gHealthBoxesIds[i]);
UpdateHealthboxAttribute(gHealthBoxesIds[i], &gEnemyParty[gBattlePartyID[i]], HEALTHBOX_HEALTH_BAR);
UpdateStatusIconInHealthbox(gHealthboxSpriteIds[i]);
UpdateHealthboxAttribute(gHealthboxSpriteIds[i], &gEnemyParty[gBattlerPartyIndexes[i]], HEALTHBOX_HEALTH_BAR);
if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
UpdateHealthboxAttribute(gHealthBoxesIds[i], &gEnemyParty[gBattlePartyID[i]], HEALTHBOX_NICK);
UpdateHealthboxAttribute(gHealthboxSpriteIds[i], &gEnemyParty[gBattlerPartyIndexes[i]], HEALTHBOX_NICK);
}
}
gSprites[gHealthBoxesIds[i]].data[7] ^= 1;
gSprites[gHealthboxSpriteIds[i]].data[7] ^= 1;
}
}
}
@@ -1486,9 +1478,9 @@ u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 ar
u8 ballIconSpritesIds[6];
u8 taskId;
if (!arg2 || GetBankIdentity(bank) != IDENTITY_OPPONENT_MON2)
if (!arg2 || GetBattlerPosition(bank) != B_POSITION_OPPONENT_RIGHT)
{
if (GetBankSide(bank) == SIDE_PLAYER)
if (GetBattlerSide(bank) == B_SIDE_PLAYER)
{
isOpponent = FALSE;
bar_X = 136, bar_Y = 96;
@@ -1536,7 +1528,7 @@ u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 ar
gSprites[barSpriteId].pos1.x += 96;
}
for (i = 0; i < 6; i++)
for (i = 0; i < PARTY_SIZE; i++)
{
ballIconSpritesIds[i] = CreateSpriteAtEnd(&sStatusSummaryBallsSpriteTemplates[isOpponent], bar_X, bar_Y - 4, 9);
@@ -1567,7 +1559,7 @@ u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 ar
gSprites[ballIconSpritesIds[i]].data[2] = isOpponent;
}
if (GetBankSide(bank) == SIDE_PLAYER)
if (GetBattlerSide(bank) == B_SIDE_PLAYER)
{
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
@@ -1712,7 +1704,7 @@ void sub_8073C30(u8 taskId)
{
for (i = 0; i < 6; i++)
{
if (GetBankSide(bank) != SIDE_PLAYER)
if (GetBattlerSide(bank) != B_SIDE_PLAYER)
{
gSprites[sp[5 - i]].data[1] = 7 * i;
gSprites[sp[5 - i]].data[3] = 0;
@@ -1964,7 +1956,7 @@ static void UpdateNickInHealthbox(u8 healthboxSpriteId, struct Pokemon *mon)
spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32;
if (GetBankSide(gSprites[healthboxSpriteId].data[6]) == SIDE_PLAYER)
if (GetBattlerSide(gSprites[healthboxSpriteId].data[6]) == B_SIDE_PLAYER)
{
sub_8075198((void*)(0x6010040 + spriteTileNum), windowTileData, 6);
ptr = (void*)(OBJ_VRAM0);
@@ -1992,9 +1984,9 @@ static void TryAddPokeballIconToHealthbox(u8 healthboxSpriteId, bool8 noStatus)
return;
bank = gSprites[healthboxSpriteId].data[6];
if (GetBankSide(bank) == SIDE_PLAYER)
if (GetBattlerSide(bank) == B_SIDE_PLAYER)
return;
if (!GetSetPokedexFlag(SpeciesToNationalPokedexNum(GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES)), FLAG_GET_CAUGHT))
if (!GetSetPokedexFlag(SpeciesToNationalPokedexNum(GetMonData(&gEnemyParty[gBattlerPartyIndexes[bank]], MON_DATA_SPECIES)), FLAG_GET_CAUGHT))
return;
healthboxSpriteId_2 = gSprites[healthboxSpriteId].data[5];
@@ -2016,9 +2008,9 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId)
bank = gSprites[healthboxSpriteId].data[6];
healthboxSpriteId_2 = gSprites[healthboxSpriteId].data[5];
if (GetBankSide(bank) == SIDE_PLAYER)
if (GetBattlerSide(bank) == B_SIDE_PLAYER)
{
status = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_STATUS);
status = GetMonData(&gPlayerParty[gBattlerPartyIndexes[bank]], MON_DATA_STATUS);
if (!IsDoubleBattle())
tileNumAdder = 0x1A;
else
@@ -2026,31 +2018,31 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId)
}
else
{
status = GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_STATUS);
status = GetMonData(&gEnemyParty[gBattlerPartyIndexes[bank]], MON_DATA_STATUS);
tileNumAdder = 0x11;
}
if (status & STATUS_SLEEP)
if (status & STATUS1_SLEEP)
{
statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(HEALTHBOX_GFX_STATUS_SLP_BANK0, bank));
statusPalId = PAL_STATUS_SLP;
}
else if (status & STATUS_PSN_ANY)
else if (status & STATUS1_PSN_ANY)
{
statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(HEALTHBOX_GFX_STATUS_PSN_BANK0, bank));
statusPalId = PAL_STATUS_PSN;
}
else if (status & STATUS_BURN)
else if (status & STATUS1_BURN)
{
statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(HEALTHBOX_GFX_STATUS_BRN_BANK0, bank));
statusPalId = PAL_STATUS_BRN;
}
else if (status & STATUS_FREEZE)
else if (status & STATUS1_FREEZE)
{
statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(HEALTHBOX_GFX_STATUS_FRZ_BANK0, bank));
statusPalId = PAL_STATUS_FRZ;
}
else if (status & STATUS_PARALYSIS)
else if (status & STATUS1_PARALYSIS)
{
statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(HEALTHBOX_GFX_STATUS_PRZ_BANK0, bank));
statusPalId = PAL_STATUS_PAR;
@@ -2062,7 +2054,7 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId)
for (i = 0; i < 3; i++)
CpuCopy32(statusGfxPtr, (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId].oam.tileNum + tileNumAdder + i) * 32), 32);
if (!gBattleSpritesDataPtr->bankData[bank].hpNumbersNoBars)
if (!gBattleSpritesDataPtr->battlerData[bank].hpNumbersNoBars)
CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_1), (void *)(OBJ_VRAM0 + gSprites[healthboxSpriteId_2].oam.tileNum * 32), 64);
TryAddPokeballIconToHealthbox(healthboxSpriteId, TRUE);
@@ -2075,9 +2067,9 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId)
FillPalette(sStatusIconColors[statusPalId], pltAdder + 0x100, 2);
CpuCopy16(gPlttBufferUnfaded + 0x100 + pltAdder, (void*)(OBJ_PLTT + pltAdder * 2), 2);
CpuCopy32(statusGfxPtr, (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId].oam.tileNum + tileNumAdder) * 32), 96);
if (IsDoubleBattle() == TRUE || GetBankSide(bank) == SIDE_OPPONENT)
if (IsDoubleBattle() == TRUE || GetBattlerSide(bank) == B_SIDE_OPPONENT)
{
if (!gBattleSpritesDataPtr->bankData[bank].hpNumbersNoBars)
if (!gBattleSpritesDataPtr->battlerData[bank].hpNumbersNoBars)
{
CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_0), (void*)(OBJ_VRAM0 + gSprites[healthboxSpriteId_2].oam.tileNum * 32), 32);
CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_65), (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId_2].oam.tileNum + 1) * 32), 32);
@@ -2181,9 +2173,9 @@ void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elem
u8 bank = gSprites[healthboxSpriteId].data[6];
if (elementId == HEALTHBOX_ALL && !IsDoubleBattle())
GetBankSide(bank); // pointless function call
GetBattlerSide(bank); // pointless function call
if (GetBankSide(gSprites[healthboxSpriteId].data[6]) == SIDE_PLAYER)
if (GetBattlerSide(gSprites[healthboxSpriteId].data[6]) == B_SIDE_PLAYER)
{
u8 isDoubles;
@@ -2275,7 +2267,7 @@ s32 sub_8074AA0(u8 bank, u8 healthboxSpriteId, u8 whichBar, u8 arg3)
8, expFraction);
}
if (whichBar == EXP_BAR || (whichBar == HEALTH_BAR && !gBattleSpritesDataPtr->bankData[bank].hpNumbersNoBars))
if (whichBar == EXP_BAR || (whichBar == HEALTH_BAR && !gBattleSpritesDataPtr->battlerData[bank].hpNumbersNoBars))
sub_8074B9C(bank, whichBar);
if (var == -1)
@@ -2323,7 +2315,7 @@ static void sub_8074B9C(u8 bank, u8 whichBar)
gBattleSpritesDataPtr->battleBars[bank].receivedValue,
&gBattleSpritesDataPtr->battleBars[bank].field_10,
array, 8);
level = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_LEVEL);
level = GetMonData(&gPlayerParty[gBattlerPartyIndexes[bank]], MON_DATA_LEVEL);
if (level == MAX_MON_LEVEL)
{
for (i = 0; i < 8; i++)
@@ -2566,17 +2558,17 @@ u8 GetHPBarLevel(s16 hp, s16 maxhp)
static u8* AddTextPrinterAndCreateWindowOnHealthbox(const u8 *str, u32 x, u32 y, u32 arg3, u32 *windowId)
{
u16 winId;
struct TextColor color;
u8 color[3];
struct WindowTemplate winTemplate = sHealthboxWindowTemplate;
winId = AddWindow(&winTemplate);
FillWindowPixelBuffer(winId, (arg3 << 4) | (arg3));
color.fgColor = arg3;
color.bgColor = 1;
color.shadowColor = 3;
color[0] = arg3;
color[1] = 1;
color[2] = 3;
AddTextPrinterParameterized2(winId, 0, x, y, 0, 0, &color, -1, str);
AddTextPrinterParameterized2(winId, 0, x, y, 0, 0, color, -1, str);
*windowId = winId;
return (u8*)(GetWindowAttribute(winId, WINDOW_TILE_DATA));
File diff suppressed because it is too large Load Diff
+83 -98
View File
@@ -1,7 +1,7 @@
#include "global.h"
#include "battle.h"
#include "battle_message.h"
#include "battle_string_ids.h"
#include "constants/battle_string_ids.h"
#include "constants/moves.h"
#include "text.h"
#include "string_util.h"
@@ -13,23 +13,11 @@
#include "palette.h"
#include "battle_controllers.h"
#include "battle_setup.h"
#include "menu.h"
#include "recorded_battle.h"
#include "international_string_util.h"
extern u16 gLastUsedItem;
extern u8 gLastUsedAbility;
extern u8 gActiveBank;
extern u8 gBankAttacker;
extern u8 gBankTarget;
extern u8 gStringBank;
extern u8 gEffectBank;
extern u8 gAbilitiesPerBank[BATTLE_BANKS_COUNT];
extern u32 gBattleTypeFlags;
extern u16 gTrainerBattleOpponent_A;
extern u16 gTrainerBattleOpponent_B;
extern u16 gPartnerTrainerId;
extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
extern struct BattleEnigmaBerry gEnigmaBerries[BATTLE_BANKS_COUNT];
extern u8 gBattleBufferA[BATTLE_BANKS_COUNT][0x200];
extern u8 gMoveSelectionCursor[BATTLE_BANKS_COUNT];
extern u8 gBattlerAbilities[MAX_BATTLERS_COUNT];
extern u8 gUnknown_0203C7B4;
extern struct StringInfoBattle *gStringInfo;
@@ -56,9 +44,6 @@ extern void GetEreaderTrainerName(u8 *txtPtr);
extern void sub_81A36D0(u8 arg0, u16 trainerId); // battle_frontier_2
extern void sub_81D572C(u8 arg0, u16 trainerId); // pokenav
extern void GetFrontierTrainerName(u8 *dst, u16 trainerId);
extern s32 GetStringCenterAlignXOffsetWithLetterSpacing(u8 fontId, const u8 *str, s32 totalWidth, s16 letterSpacing);
extern u8 GetTextSpeedInRecordedBattle(void);
extern u8 GetPlayerTextSpeed(void);
// this file's functions
static void sub_814F8F8(u8 *textPtr);
@@ -1430,18 +1415,18 @@ void BufferStringBattle(u16 stringID)
s32 i;
const u8* stringPtr = NULL;
gStringInfo = (struct StringInfoBattle*)(&gBattleBufferA[gActiveBank][4]);
gStringInfo = (struct StringInfoBattle*)(&gBattleBufferA[gActiveBattler][4]);
gLastUsedItem = gStringInfo->lastItem;
gLastUsedAbility = gStringInfo->lastAbility;
gBattleScripting.bank = gStringInfo->scrActive;
gBattleScripting.battler = gStringInfo->scrActive;
*(&gBattleStruct->field_52) = gStringInfo->unk1605E;
*(&gBattleStruct->hpScale) = gStringInfo->hpScale;
gStringBank = gStringInfo->StringBank;
gPotentialItemEffectBattler = gStringInfo->StringBank;
*(&gBattleStruct->stringMoveType) = gStringInfo->moveType;
for (i = 0; i < BATTLE_BANKS_COUNT; i++)
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
gAbilitiesPerBank[i] = gStringInfo->abilities[i];
gBattlerAbilities[i] = gStringInfo->abilities[i];
}
for (i = 0; i < TEXT_BUFF_ARRAY_COUNT; i++)
{
@@ -1501,7 +1486,7 @@ void BufferStringBattle(u16 stringID)
}
break;
case STRINGID_INTROSENDOUT: // poke first send-out
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
{
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
@@ -1546,7 +1531,7 @@ void BufferStringBattle(u16 stringID)
}
break;
case STRINGID_RETURNMON: // sending poke to ball msg
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
{
if (*(&gBattleStruct->hpScale) == 0)
stringPtr = gText_PkmnThatsEnough;
@@ -1573,7 +1558,7 @@ void BufferStringBattle(u16 stringID)
}
break;
case STRINGID_SWITCHINMON: // switch-in msg
if (GetBankSide(gBattleScripting.bank) == SIDE_PLAYER)
if (GetBattlerSide(gBattleScripting.battler) == B_SIDE_PLAYER)
{
if (*(&gBattleStruct->hpScale) == 0 || gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
stringPtr = gText_GoPkmn2;
@@ -1590,7 +1575,7 @@ void BufferStringBattle(u16 stringID)
{
if (gBattleTypeFlags & BATTLE_TYPE_x800000)
{
if (gBattleScripting.bank == 1)
if (gBattleScripting.battler == 1)
stringPtr = gText_Trainer1SentOutPkmn2;
else
stringPtr = gText_Trainer2SentOutPkmn;
@@ -1609,7 +1594,7 @@ void BufferStringBattle(u16 stringID)
{
if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)
{
if (gBattleScripting.bank == 1)
if (gBattleScripting.battler == 1)
stringPtr = gText_Trainer1SentOutPkmn2;
else
stringPtr = gText_Trainer2SentOutPkmn;
@@ -1633,13 +1618,13 @@ void BufferStringBattle(u16 stringID)
stringPtr = gText_AttackerUsedX;
break;
case STRINGID_BATTLEEND: // battle end
if (gBattleTextBuff1[0] & OUTCOME_LINK_BATTLE_RUN)
if (gBattleTextBuff1[0] & B_OUTCOME_LINK_BATTLE_RAN)
{
gBattleTextBuff1[0] &= ~(OUTCOME_LINK_BATTLE_RUN);
if (GetBankSide(gActiveBank) == SIDE_OPPONENT && gBattleTextBuff1[0] != BATTLE_DREW)
gBattleTextBuff1[0] ^= (BATTLE_LOST | BATTLE_WON);
gBattleTextBuff1[0] &= ~(B_OUTCOME_LINK_BATTLE_RAN);
if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT && gBattleTextBuff1[0] != B_OUTCOME_DREW)
gBattleTextBuff1[0] ^= (B_OUTCOME_LOST | B_OUTCOME_WON);
if (gBattleTextBuff1[0] == BATTLE_LOST || gBattleTextBuff1[0] == BATTLE_DREW)
if (gBattleTextBuff1[0] == B_OUTCOME_LOST || gBattleTextBuff1[0] == B_OUTCOME_DREW)
stringPtr = gText_GotAwaySafely;
else if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
stringPtr = gText_TwoWildFled;
@@ -1648,23 +1633,23 @@ void BufferStringBattle(u16 stringID)
}
else
{
if (GetBankSide(gActiveBank) == SIDE_OPPONENT && gBattleTextBuff1[0] != BATTLE_DREW)
gBattleTextBuff1[0] ^= (BATTLE_LOST | BATTLE_WON);
if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT && gBattleTextBuff1[0] != B_OUTCOME_DREW)
gBattleTextBuff1[0] ^= (B_OUTCOME_LOST | B_OUTCOME_WON);
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
switch (gBattleTextBuff1[0])
{
case BATTLE_WON:
case B_OUTCOME_WON:
if (gBattleTypeFlags & BATTLE_TYPE_x800000)
stringPtr = gText_TwoInGameTrainersDefeated;
else
stringPtr = gText_TwoLinkTrainersDefeated;
break;
case BATTLE_LOST:
case B_OUTCOME_LOST:
stringPtr = gText_PlayerLostToTwo;
break;
case BATTLE_DREW:
case B_OUTCOME_DREW:
stringPtr = gText_PlayerBattledToDrawVsTwo;
break;
}
@@ -1673,13 +1658,13 @@ void BufferStringBattle(u16 stringID)
{
switch (gBattleTextBuff1[0])
{
case BATTLE_WON:
case B_OUTCOME_WON:
stringPtr = gText_PlayerDefeatedLinkTrainerTrainer1;
break;
case BATTLE_LOST:
case B_OUTCOME_LOST:
stringPtr = gText_PlayerLostAgainstTrainer1;
break;
case BATTLE_DREW:
case B_OUTCOME_DREW:
stringPtr = gText_PlayerBattledToDrawTrainer1;
break;
}
@@ -1688,13 +1673,13 @@ void BufferStringBattle(u16 stringID)
{
switch (gBattleTextBuff1[0])
{
case BATTLE_WON:
case B_OUTCOME_WON:
stringPtr = gText_PlayerDefeatedLinkTrainer;
break;
case BATTLE_LOST:
case B_OUTCOME_LOST:
stringPtr = gText_PlayerLostAgainstLinkTrainer;
break;
case BATTLE_DREW:
case B_OUTCOME_DREW:
stringPtr = gText_PlayerBattledToDrawLinkTrainer;
break;
}
@@ -1754,7 +1739,7 @@ static const u8* TryGetStatusString(u8* src)
}
#define HANDLE_NICKNAME_STRING_CASE(bank, monIndex) \
if (GetBankSide(bank) != SIDE_PLAYER) \
if (GetBattlerSide(bank) != B_SIDE_PLAYER) \
{ \
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) \
toCpy = gText_FoePkmnPrefix; \
@@ -1836,80 +1821,80 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
toCpy = gStringVar3;
break;
case B_TXT_PLAYER_MON1_NAME: // first player poke name
GetMonData(&gPlayerParty[gBattlePartyID[GetBankByIdentity(IDENTITY_PLAYER_MON1)]],
GetMonData(&gPlayerParty[gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]],
MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case B_TXT_OPPONENT_MON1_NAME: // first enemy poke name
GetMonData(&gEnemyParty[gBattlePartyID[GetBankByIdentity(IDENTITY_OPPONENT_MON1)]],
GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)]],
MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case B_TXT_PLAYER_MON2_NAME: // second player poke name
GetMonData(&gPlayerParty[gBattlePartyID[GetBankByIdentity(IDENTITY_PLAYER_MON2)]],
GetMonData(&gPlayerParty[gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT)]],
MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case B_TXT_OPPONENT_MON2_NAME: // second enemy poke name
GetMonData(&gEnemyParty[gBattlePartyID[GetBankByIdentity(IDENTITY_OPPONENT_MON2)]],
GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)]],
MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case B_TXT_LINK_PLAYER_MON1_NAME: // link first player poke name
GetMonData(&gPlayerParty[gBattlePartyID[gLinkPlayers[multiplayerID].lp_field_18]],
GetMonData(&gPlayerParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].lp_field_18]],
MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case B_TXT_LINK_OPPONENT_MON1_NAME: // link first opponent poke name
GetMonData(&gEnemyParty[gBattlePartyID[gLinkPlayers[multiplayerID].lp_field_18 ^ 1]],
GetMonData(&gEnemyParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].lp_field_18 ^ 1]],
MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case B_TXT_LINK_PLAYER_MON2_NAME: // link second player poke name
GetMonData(&gPlayerParty[gBattlePartyID[gLinkPlayers[multiplayerID].lp_field_18 ^ 2]],
GetMonData(&gPlayerParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].lp_field_18 ^ 2]],
MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case B_TXT_LINK_OPPONENT_MON2_NAME: // link second opponent poke name
GetMonData(&gEnemyParty[gBattlePartyID[gLinkPlayers[multiplayerID].lp_field_18 ^ 3]],
GetMonData(&gEnemyParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].lp_field_18 ^ 3]],
MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case B_TXT_ATK_NAME_WITH_PREFIX_MON1: // attacker name with prefix, only bank 0/1
HANDLE_NICKNAME_STRING_CASE(gBankAttacker,
gBattlePartyID[GetBankByIdentity(GET_BANK_SIDE(gBankAttacker))])
HANDLE_NICKNAME_STRING_CASE(gBattlerAttacker,
gBattlerPartyIndexes[GetBattlerAtPosition(GET_BATTLER_SIDE(gBattlerAttacker))])
break;
case B_TXT_ATK_PARTNER_NAME: // attacker partner name
if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
GetMonData(&gPlayerParty[gBattlePartyID[GetBankByIdentity(GET_BANK_SIDE(gBankAttacker)) + 2]], MON_DATA_NICKNAME, text);
if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
GetMonData(&gPlayerParty[gBattlerPartyIndexes[GetBattlerAtPosition(GET_BATTLER_SIDE(gBattlerAttacker)) + 2]], MON_DATA_NICKNAME, text);
else
GetMonData(&gEnemyParty[gBattlePartyID[GetBankByIdentity(GET_BANK_SIDE(gBankAttacker)) + 2]], MON_DATA_NICKNAME, text);
GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetBattlerAtPosition(GET_BATTLER_SIDE(gBattlerAttacker)) + 2]], MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case B_TXT_ATK_NAME_WITH_PREFIX: // attacker name with prefix
HANDLE_NICKNAME_STRING_CASE(gBankAttacker, gBattlePartyID[gBankAttacker])
HANDLE_NICKNAME_STRING_CASE(gBattlerAttacker, gBattlerPartyIndexes[gBattlerAttacker])
break;
case B_TXT_DEF_NAME_WITH_PREFIX: // target name with prefix
HANDLE_NICKNAME_STRING_CASE(gBankTarget, gBattlePartyID[gBankTarget])
HANDLE_NICKNAME_STRING_CASE(gBattlerTarget, gBattlerPartyIndexes[gBattlerTarget])
break;
case B_TXT_EFF_NAME_WITH_PREFIX: // effect bank name with prefix
HANDLE_NICKNAME_STRING_CASE(gEffectBank, gBattlePartyID[gEffectBank])
HANDLE_NICKNAME_STRING_CASE(gEffectBattler, gBattlerPartyIndexes[gEffectBattler])
break;
case B_TXT_ACTIVE_NAME_WITH_PREFIX: // active bank name with prefix
HANDLE_NICKNAME_STRING_CASE(gActiveBank, gBattlePartyID[gActiveBank])
HANDLE_NICKNAME_STRING_CASE(gActiveBattler, gBattlerPartyIndexes[gActiveBattler])
break;
case B_TXT_SCR_ACTIVE_NAME_WITH_PREFIX: // scripting active bank name with prefix
HANDLE_NICKNAME_STRING_CASE(gBattleScripting.bank, gBattlePartyID[gBattleScripting.bank])
HANDLE_NICKNAME_STRING_CASE(gBattleScripting.battler, gBattlerPartyIndexes[gBattleScripting.battler])
break;
case B_TXT_CURRENT_MOVE: // current move name
if (gStringInfo->currentMove > LAST_MOVE_INDEX)
@@ -1930,10 +1915,10 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
{
if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
if ((gBattleScripting.multiplayerId != 0 && (gStringBank & BIT_SIDE))
|| (gBattleScripting.multiplayerId == 0 && !(gStringBank & BIT_SIDE)))
if ((gBattleScripting.multiplayerId != 0 && (gPotentialItemEffectBattler & BIT_SIDE))
|| (gBattleScripting.multiplayerId == 0 && !(gPotentialItemEffectBattler & BIT_SIDE)))
{
StringCopy(text, gEnigmaBerries[gStringBank].name);
StringCopy(text, gEnigmaBerries[gPotentialItemEffectBattler].name);
StringAppend(text, gText_BerrySuffix);
toCpy = text;
}
@@ -1944,9 +1929,9 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
}
else
{
if (gLinkPlayers[gBattleScripting.multiplayerId].lp_field_18 == gStringBank)
if (gLinkPlayers[gBattleScripting.multiplayerId].lp_field_18 == gPotentialItemEffectBattler)
{
StringCopy(text, gEnigmaBerries[gStringBank].name);
StringCopy(text, gEnigmaBerries[gPotentialItemEffectBattler].name);
StringAppend(text, gText_BerrySuffix);
toCpy = text;
}
@@ -1970,16 +1955,16 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
toCpy = gAbilityNames[gLastUsedAbility];
break;
case B_TXT_ATK_ABILITY: // attacker ability
toCpy = gAbilityNames[gAbilitiesPerBank[gBankAttacker]];
toCpy = gAbilityNames[gBattlerAbilities[gBattlerAttacker]];
break;
case B_TXT_DEF_ABILITY: // target ability
toCpy = gAbilityNames[gAbilitiesPerBank[gBankTarget]];
toCpy = gAbilityNames[gBattlerAbilities[gBattlerTarget]];
break;
case B_TXT_SCR_ACTIVE_ABILITY: // scripting active ability
toCpy = gAbilityNames[gAbilitiesPerBank[gBattleScripting.bank]];
toCpy = gAbilityNames[gBattlerAbilities[gBattleScripting.battler]];
break;
case B_TXT_EFF_ABILITY: // effect bank ability
toCpy = gAbilityNames[gAbilitiesPerBank[gEffectBank]];
toCpy = gAbilityNames[gBattlerAbilities[gEffectBattler]];
break;
case B_TXT_TRAINER1_CLASS: // trainer class name
if (gBattleTypeFlags & BATTLE_TYPE_SECRET_BASE)
@@ -2039,16 +2024,16 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
toCpy = gLinkPlayers[multiplayerID].name;
break;
case B_TXT_1F: // link partner name?
toCpy = gLinkPlayers[GetBankMultiplayerId(2 ^ gLinkPlayers[multiplayerID].lp_field_18)].name;
toCpy = gLinkPlayers[GetBattlerMultiplayerId(2 ^ gLinkPlayers[multiplayerID].lp_field_18)].name;
break;
case B_TXT_20: // link opponent 1 name?
toCpy = gLinkPlayers[GetBankMultiplayerId(1 ^ gLinkPlayers[multiplayerID].lp_field_18)].name;
toCpy = gLinkPlayers[GetBattlerMultiplayerId(1 ^ gLinkPlayers[multiplayerID].lp_field_18)].name;
break;
case B_TXT_21: // link opponent 2 name?
toCpy = gLinkPlayers[GetBankMultiplayerId(3 ^ gLinkPlayers[multiplayerID].lp_field_18)].name;
toCpy = gLinkPlayers[GetBattlerMultiplayerId(3 ^ gLinkPlayers[multiplayerID].lp_field_18)].name;
break;
case B_TXT_22: // link scripting active name
toCpy = gLinkPlayers[GetBankMultiplayerId(gBattleScripting.bank)].name;
toCpy = gLinkPlayers[GetBattlerMultiplayerId(gBattleScripting.battler)].name;
break;
case B_TXT_PLAYER_NAME: // player name
if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
@@ -2085,7 +2070,7 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
}
break;
case B_TXT_26: // ?
HANDLE_NICKNAME_STRING_CASE(gBattleScripting.bank, *(&gBattleStruct->field_52))
HANDLE_NICKNAME_STRING_CASE(gBattleScripting.battler, *(&gBattleStruct->field_52))
break;
case B_TXT_PC_CREATOR_NAME: // lanette pc
if (FlagGet(FLAG_SYS_PC_LANETTE))
@@ -2094,37 +2079,37 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
toCpy = gText_Someones;
break;
case B_TXT_ATK_PREFIX2:
if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
toCpy = gText_AllyPkmnPrefix2;
else
toCpy = gText_FoePkmnPrefix3;
break;
case B_TXT_DEF_PREFIX2:
if (GetBankSide(gBankTarget) == SIDE_PLAYER)
if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER)
toCpy = gText_AllyPkmnPrefix2;
else
toCpy = gText_FoePkmnPrefix3;
break;
case B_TXT_ATK_PREFIX1:
if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
toCpy = gText_AllyPkmnPrefix;
else
toCpy = gText_FoePkmnPrefix2;
break;
case B_TXT_DEF_PREFIX1:
if (GetBankSide(gBankTarget) == SIDE_PLAYER)
if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER)
toCpy = gText_AllyPkmnPrefix;
else
toCpy = gText_FoePkmnPrefix2;
break;
case B_TXT_ATK_PREFIX3:
if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
toCpy = gText_AllyPkmnPrefix3;
else
toCpy = gText_FoePkmnPrefix4;
break;
case B_TXT_DEF_PREFIX3:
if (GetBankSide(gBankTarget) == SIDE_PLAYER)
if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER)
toCpy = gText_AllyPkmnPrefix3;
else
toCpy = gText_FoePkmnPrefix4;
@@ -2266,7 +2251,7 @@ static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst)
srcID += 2;
break;
case B_BUFF_MON_NICK_WITH_PREFIX: // poke nick with prefix
if (GetBankSide(src[srcID + 1]) == SIDE_PLAYER)
if (GetBattlerSide(src[srcID + 1]) == B_SIDE_PLAYER)
{
GetMonData(&gPlayerParty[src[srcID + 2]], MON_DATA_NICKNAME, text);
}
@@ -2292,7 +2277,7 @@ static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst)
srcID += 3;
break;
case B_BUFF_MON_NICK: // poke nick without prefix
if (GetBankSide(src[srcID + 1]) == SIDE_PLAYER)
if (GetBattlerSide(src[srcID + 1]) == B_SIDE_PLAYER)
GetMonData(&gPlayerParty[src[srcID + 2]], MON_DATA_NICKNAME, dst);
else
GetMonData(&gEnemyParty[src[srcID + 2]], MON_DATA_NICKNAME, dst);
@@ -2313,9 +2298,9 @@ static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst)
{
if (hword == ITEM_ENIGMA_BERRY)
{
if (gLinkPlayers[gBattleScripting.multiplayerId].lp_field_18 == gStringBank)
if (gLinkPlayers[gBattleScripting.multiplayerId].lp_field_18 == gPotentialItemEffectBattler)
{
StringCopy(dst, gEnigmaBerries[gStringBank].name);
StringCopy(dst, gEnigmaBerries[gPotentialItemEffectBattler].name);
StringAppend(dst, gText_BerrySuffix);
}
else
@@ -2360,20 +2345,20 @@ static void sub_814F8F8(u8* textBuff)
// Appends "!" to the text buffer `dst`. In the original Japanese this looked
// into the table of moves at sUnknownMoveTable and varied the line accordingly.
//
//
// gText_ExclamationMark was a plain "!", used for any attack not on the list.
// It resulted in the translation "<NAME>'s <ATTACK>!".
//
//
// gText_ExclamationMark2 was "を つかった!". This resulted in the translation
// "<NAME> used <ATTACK>!", which was used for all attacks in English.
//
//
// gText_ExclamationMark3 was "した!". This was used for those moves whose
// names were verbs, such as Recover, and resulted in translations like "<NAME>
// recovered itself!".
//
//
// gText_ExclamationMark4 was "を した!" This resulted in a translation of
// "<NAME> did an <ATTACK>!".
//
//
// gText_ExclamationMark5 was " こうげき!" This resulted in a translation of
// "<NAME>'s <ATTACK> attack!".
static void sub_814F950(u8* dst)
@@ -2440,7 +2425,7 @@ void BattleHandleAddTextPrinter(const u8 *text, u8 arg1)
textSubPrinter.letterSpacing = r8[(12 * arg1) + 4];
textSubPrinter.lineSpacing = r8[(12 * arg1) + 5];
textSubPrinter.fontColor_l = 0;
textSubPrinter.fontColor_h = r8[(12 * arg1) + 7];
textSubPrinter.fgColor = r8[(12 * arg1) + 7];
textSubPrinter.bgColor = r8[(12 * arg1) + 8];
textSubPrinter.shadowColor = r8[(12 * arg1) + 9];
@@ -2490,10 +2475,10 @@ void BattleHandleAddTextPrinter(const u8 *text, u8 arg1)
void SetPpNumbersPaletteInMoveSelection(void)
{
struct ChooseMoveStruct *chooseMoveStruct = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBank][4]);
struct ChooseMoveStruct *chooseMoveStruct = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBattler][4]);
const u16 *palPtr = gUnknown_08D85620;
u8 var = GetCurrentPpToMaxPpState(chooseMoveStruct->currentPp[gMoveSelectionCursor[gActiveBank]],
chooseMoveStruct->maxPp[gMoveSelectionCursor[gActiveBank]]);
u8 var = GetCurrentPpToMaxPpState(chooseMoveStruct->currentPp[gMoveSelectionCursor[gActiveBattler]],
chooseMoveStruct->maxPp[gMoveSelectionCursor[gActiveBattler]]);
gPlttBufferUnfaded[92] = palPtr[(var * 2) + 0];
gPlttBufferUnfaded[91] = palPtr[(var * 2) + 1];
+1937 -2001
View File
File diff suppressed because it is too large Load Diff
+9 -16
View File
@@ -30,6 +30,8 @@
#include "strings.h"
#include "secret_base.h"
#include "string_util.h"
#include "overworld.h"
#include "field_weather.h"
enum
{
@@ -59,14 +61,11 @@ extern void sub_81BE72C(void);
extern void FreezeMapObjects(void);
extern void sub_808BCF4(void);
extern void sub_80EECC8(void);
extern void c2_exit_to_overworld_1_continue_scripts_restart_music(void);
extern void c2_exit_to_overworld_2_switch(void);
extern void Overworld_ClearSavedMusic(void);
extern void CB2_WhiteOut(void);
extern void sub_80AF6F0(void);
extern void PlayBattleBGM(void);
extern void sub_81DA57C(void);
extern u8 GetSav1Weather(void);
extern u8 Overworld_GetFlashLevel(void);
extern u16 sub_81A9AA8(u8 localId);
extern u16 sub_81D6180(u8 localId);
@@ -82,12 +81,6 @@ extern void sub_81D61E8(void);
extern void sub_80982B8(void);
extern void sub_81A9EDC(u16 a0);
extern void sub_81D572C(u8 a0, u16 arg1);
extern void IncrementGameStat(u8 statId);
extern u32 GetGameStat(u8 statId);
extern u32 gBattleTypeFlags;
extern u8 gBattleOutcome;
extern void (*gFieldCallback)(void);
// this file's functions
static void DoBattlePikeWildBattle(void);
@@ -990,14 +983,14 @@ static bool32 IsPlayerDefeated(u32 battleOutcome)
{
switch (battleOutcome)
{
case BATTLE_LOST:
case BATTLE_DREW:
case B_OUTCOME_LOST:
case B_OUTCOME_DREW:
return TRUE;
case BATTLE_WON:
case BATTLE_RAN:
case BATTLE_PLAYER_TELEPORTED:
case BATTLE_POKE_FLED:
case BATTLE_CAUGHT:
case B_OUTCOME_WON:
case B_OUTCOME_RAN:
case B_OUTCOME_PLAYER_TELEPORTED:
case B_OUTCOME_MON_FLED:
case B_OUTCOME_CAUGHT:
return FALSE;
default:
return FALSE;
-2
View File
@@ -61,9 +61,7 @@ extern u16 gBattle_BG0_Y;
extern const struct OamData gFieldObjectBaseOam_32x32;
extern void c2_exit_to_overworld_2_switch(void);
extern void sub_80AC3D0(void);
extern void ScanlineEffect_Clear(void);
// this file's functions
static void LaunchBattleTransitionTask(u8 transitionId);
+826 -868
View File
File diff suppressed because it is too large Load Diff
+28 -33
View File
@@ -8,12 +8,7 @@
#include "random.h"
#include "battle_scripts.h"
extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT];
extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
extern u8 gUnknown_0203CF00[];
extern const u8 *gBattlescriptCurrInstr;
extern u8 gBattleCommunication[];
extern u8 gActiveBank;
extern void sub_81D55D0(void);
extern void sub_81D5694(void);
@@ -79,7 +74,7 @@ void FreeBattleResources(void)
}
}
void AdjustFriendshipOnBattleFaint(u8 bank)
void AdjustFriendshipOnBattleFaint(u8 battlerId)
{
u8 opposingBank;
@@ -87,33 +82,33 @@ void AdjustFriendshipOnBattleFaint(u8 bank)
{
u8 opposingBank2;
opposingBank = GetBankByIdentity(IDENTITY_OPPONENT_MON1);
opposingBank2 = GetBankByIdentity(IDENTITY_OPPONENT_MON2);
opposingBank = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
opposingBank2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
if (gBattleMons[opposingBank2].level > gBattleMons[opposingBank].level)
opposingBank = opposingBank2;
}
else
{
opposingBank = GetBankByIdentity(IDENTITY_OPPONENT_MON1);
opposingBank = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
}
if (gBattleMons[opposingBank].level > gBattleMons[bank].level)
if (gBattleMons[opposingBank].level > gBattleMons[battlerId].level)
{
if (gBattleMons[opposingBank].level - gBattleMons[bank].level > 29)
AdjustFriendship(&gPlayerParty[gBattlePartyID[bank]], 8);
if (gBattleMons[opposingBank].level - gBattleMons[battlerId].level > 29)
AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], 8);
else
AdjustFriendship(&gPlayerParty[gBattlePartyID[bank]], 6);
AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], 6);
}
else
{
AdjustFriendship(&gPlayerParty[gBattlePartyID[bank]], 6);
AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], 6);
}
}
void sub_80571DC(u8 bank, u8 arg1)
void sub_80571DC(u8 battlerId, u8 arg1)
{
if (GetBankSide(bank) != SIDE_OPPONENT)
if (GetBattlerSide(battlerId) != B_SIDE_OPPONENT)
{
s32 i;
@@ -122,14 +117,14 @@ void sub_80571DC(u8 bank, u8 arg1)
for (i = 0; i < 3; i++)
gUnknown_0203CF00[i] = *(0 * 3 + i + (u8*)(gBattleStruct->field_60));
sub_81B8FB0(pokemon_order_func(gBattlePartyID[bank]), pokemon_order_func(arg1));
sub_81B8FB0(pokemon_order_func(gBattlerPartyIndexes[battlerId]), pokemon_order_func(arg1));
for (i = 0; i < 3; i++)
*(0 * 3 + i + (u8*)(gBattleStruct->field_60)) = gUnknown_0203CF00[i];
}
}
u32 sub_805725C(u8 bank)
u32 sub_805725C(u8 battlerId)
{
u32 effect = 0;
@@ -138,12 +133,12 @@ u32 sub_805725C(u8 bank)
switch (gBattleCommunication[MULTIUSE_STATE])
{
case 0:
if (gBattleMons[bank].status1 & STATUS_SLEEP)
if (gBattleMons[battlerId].status1 & STATUS1_SLEEP)
{
if (UproarWakeUpCheck(bank))
if (UproarWakeUpCheck(battlerId))
{
gBattleMons[bank].status1 &= ~(STATUS_SLEEP);
gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE);
gBattleMons[battlerId].status1 &= ~(STATUS1_SLEEP);
gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE);
BattleScriptPushCursor();
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp;
@@ -153,24 +148,24 @@ u32 sub_805725C(u8 bank)
{
u32 toSub;
if (gBattleMons[bank].ability == ABILITY_EARLY_BIRD)
if (gBattleMons[battlerId].ability == ABILITY_EARLY_BIRD)
toSub = 2;
else
toSub = 1;
if ((gBattleMons[bank].status1 & STATUS_SLEEP) < toSub)
gBattleMons[bank].status1 &= ~(STATUS_SLEEP);
if ((gBattleMons[battlerId].status1 & STATUS1_SLEEP) < toSub)
gBattleMons[battlerId].status1 &= ~(STATUS1_SLEEP);
else
gBattleMons[bank].status1 -= toSub;
gBattleMons[battlerId].status1 -= toSub;
if (gBattleMons[bank].status1 & STATUS_SLEEP)
if (gBattleMons[battlerId].status1 & STATUS1_SLEEP)
{
gBattlescriptCurrInstr = BattleScript_MoveUsedIsAsleep;
effect = 2;
}
else
{
gBattleMons[bank].status2 &= ~(STATUS2_NIGHTMARE);
gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE);
BattleScriptPushCursor();
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp;
@@ -181,7 +176,7 @@ u32 sub_805725C(u8 bank)
gBattleCommunication[MULTIUSE_STATE]++;
break;
case 1:
if (gBattleMons[bank].status1 & STATUS_FREEZE)
if (gBattleMons[battlerId].status1 & STATUS1_FREEZE)
{
if (Random() % 5 != 0)
{
@@ -189,7 +184,7 @@ u32 sub_805725C(u8 bank)
}
else
{
gBattleMons[bank].status1 &= ~(STATUS_FREEZE);
gBattleMons[battlerId].status1 &= ~(STATUS1_FREEZE);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze;
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
@@ -206,9 +201,9 @@ u32 sub_805725C(u8 bank)
if (effect == 2)
{
gActiveBank = bank;
EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBank].status1);
MarkBufferBankForExecution(gActiveBank);
gActiveBattler = battlerId;
BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1);
MarkBattlerForControllerExec(gActiveBattler);
}
return effect;
+13 -14
View File
@@ -18,7 +18,6 @@
#include "event_data.h"
#include "main.h"
#include "link.h"
#include "new_menu_helpers.h"
#include "item_menu_icons.h"
#include "berry.h"
#include "item.h"
@@ -3489,7 +3488,7 @@ void ShowBerryBlenderRecordWindow(void)
winTemplate = sBlenderRecordWindowTemplate;
gResultsWindowId = AddWindow(&winTemplate);
sub_81973FC(gResultsWindowId, 0);
NewMenuHelpers_DrawStdWindowFrame(gResultsWindowId, 0);
FillWindowPixelBuffer(gResultsWindowId, 0x11);
xPos = GetStringCenterAlignXOffset(1, gText_BlenderMaxSpeedRecord, 0x90);
@@ -3574,35 +3573,35 @@ static bool32 TryAddContestLinkTvShow(struct Pokeblock *pokeblock, struct TvBlen
static void Blender_AddTextPrinter(u8 windowId, const u8 *string, u8 x, u8 y, s32 speed, s32 caseId)
{
struct TextColor txtColor;
u8 txtColor[3];
u32 letterSpacing = 0;
switch (caseId)
{
case 0:
case 3:
txtColor.fgColor = 1;
txtColor.bgColor = 2;
txtColor.shadowColor = 3;
txtColor[0] = 1;
txtColor[1] = 2;
txtColor[2] = 3;
break;
case 1:
txtColor.fgColor = 0;
txtColor.bgColor = 2;
txtColor.shadowColor = 3;
txtColor[0] = 0;
txtColor[1] = 2;
txtColor[2] = 3;
break;
case 2:
txtColor.fgColor = 0;
txtColor.bgColor = 4;
txtColor.shadowColor = 5;
txtColor[0] = 0;
txtColor[1] = 4;
txtColor[2] = 5;
break;
}
if (caseId != 3)
{
FillWindowPixelBuffer(windowId, txtColor.fgColor | (txtColor.fgColor << 4));
FillWindowPixelBuffer(windowId, txtColor[0] | (txtColor[0] << 4));
}
AddTextPrinterParameterized2(windowId, 1, x, y, letterSpacing, 1, &txtColor, speed, string);
AddTextPrinterParameterized2(windowId, 1, x, y, letterSpacing, 1, txtColor, speed, string);
}
static bool32 Blender_PrintText(s16 *textState, const u8 *string, s32 textSpeed)
+18 -222
View File
@@ -133,7 +133,7 @@ extern const u8 gMultiBootProgram_BerryGlitchFix_End[];
// .text
void InitBerryFixProgram(void)
void CB2_InitBerryFixProgram(void)
{
DisableInterrupts(0xFFFF);
EnableInterrupts(0x0001);
@@ -217,10 +217,9 @@ static void berry_fix_main(void)
}
}
#ifdef NONMATCHING
static void berry_fix_gpu_set(void)
{
s32 width;
s32 width, left;
SetGpuReg(REG_OFFSET_BG0CNT, 0x0000);
SetGpuReg(REG_OFFSET_BG1CNT, 0x0000);
@@ -249,230 +248,27 @@ static void berry_fix_gpu_set(void)
FillWindowPixelBuffer(3, 0);
FillWindowPixelBuffer(0, 0xAA);
// This block is a meme among memes
width = (0x78 - GetStringWidth(0, sUnknown_08617E9B, 0)) / 2;
box_print(2, 0, width, 3, sUnknown_0861815B, -1, sUnknown_08617E9B);
width = (s32)(0x78 - GetStringWidth(0, sUnknown_08617E9B, 0)) / 2 + 0x78;
box_print(2, 0, width, 3, sUnknown_0861815B, -1, sUnknown_08617E8D);
width = (0x70 - GetStringWidth(0, sUnknown_08617E8D, 0)) / 2;
box_print(3, 0, width, 0, sUnknown_0861815B, -1, sUnknown_08617E8D);
width = (0xd0 - GetStringWidth(1, sUnknown_08617E78, 0)) / 2;
box_print(0, 1, width, 2, sUnknown_08618158, -1, sUnknown_08617E78);
width = GetStringWidth(0, sUnknown_08617E9B, 0);
left = (0x78 - width) / 2;
box_print(2, 0, left, 3, sUnknown_0861815B, TEXT_SPEED_FF, sUnknown_08617E9B);
width = GetStringWidth(0, sUnknown_08617E8D, 0);
left = (0x78 - width) / 2 + 0x78;
box_print(2, 0, left, 3, sUnknown_0861815B, TEXT_SPEED_FF, sUnknown_08617E8D);
width = GetStringWidth(0, sUnknown_08617E8D, 0);
left = (0x70 - width) / 2;
box_print(3, 0, left, 0, sUnknown_0861815B, TEXT_SPEED_FF, sUnknown_08617E8D);
width = GetStringWidth(1, sUnknown_08617E78, 0);
left = (0xD0 - width) / 2;
box_print(0, 1, left, 2, sUnknown_08618158, TEXT_SPEED_FF, sUnknown_08617E78);
CopyWindowToVram(2, 2);
CopyWindowToVram(3, 2);
CopyWindowToVram(0, 2);
}
#else
ASM_DIRECT static void berry_fix_gpu_set(void)
{
asm(".syntax unified\n"
"\tpush {r4-r6,lr}\n"
"\tmov r6, r8\n"
"\tpush {r6}\n"
"\tsub sp, 0x10\n"
"\tmovs r0, 0x8\n"
"\tmovs r1, 0\n"
"\tbl SetGpuReg\n"
"\tmovs r0, 0xA\n"
"\tmovs r1, 0\n"
"\tbl SetGpuReg\n"
"\tmovs r0, 0x10\n"
"\tmovs r1, 0\n"
"\tbl SetGpuReg\n"
"\tmovs r0, 0x12\n"
"\tmovs r1, 0\n"
"\tbl SetGpuReg\n"
"\tmovs r0, 0x14\n"
"\tmovs r1, 0\n"
"\tbl SetGpuReg\n"
"\tmovs r0, 0x16\n"
"\tmovs r1, 0\n"
"\tbl SetGpuReg\n"
"\tmovs r0, 0x50\n"
"\tmovs r1, 0\n"
"\tbl SetGpuReg\n"
"\tmovs r1, 0\n"
"\tstr r1, [sp, 0xC]\n"
"\tldr r4, =0x040000d4\n"
"\tadd r0, sp, 0xC\n"
"\tstr r0, [r4]\n"
"\tmovs r0, 0xC0\n"
"\tlsls r0, 19\n"
"\tstr r0, [r4, 0x4]\n"
"\tldr r0, =0x85006000\n"
"\tstr r0, [r4, 0x8]\n"
"\tldr r0, [r4, 0x8]\n"
"\tstr r1, [sp, 0xC]\n"
"\tadd r0, sp, 0xC\n"
"\tstr r0, [r4]\n"
"\tmovs r0, 0xE0\n"
"\tlsls r0, 19\n"
"\tstr r0, [r4, 0x4]\n"
"\tldr r2, =0x85000100\n"
"\tstr r2, [r4, 0x8]\n"
"\tldr r0, [r4, 0x8]\n"
"\tstr r1, [sp, 0xC]\n"
"\tadd r0, sp, 0xC\n"
"\tstr r0, [r4]\n"
"\tmovs r0, 0xA0\n"
"\tlsls r0, 19\n"
"\tstr r0, [r4, 0x4]\n"
"\tstr r2, [r4, 0x8]\n"
"\tldr r0, [r4, 0x8]\n"
"\tmovs r0, 0\n"
"\tbl ResetBgsAndClearDma3BusyFlags\n"
"\tldr r1, =gUnknown_08618108\n"
"\tmovs r0, 0\n"
"\tmovs r2, 0x2\n"
"\tbl InitBgsFromTemplates\n"
"\tmovs r0, 0\n"
"\tmovs r1, 0\n"
"\tmovs r2, 0\n"
"\tbl ChangeBgX\n"
"\tmovs r0, 0\n"
"\tmovs r1, 0\n"
"\tmovs r2, 0\n"
"\tbl ChangeBgY\n"
"\tmovs r0, 0x1\n"
"\tmovs r1, 0\n"
"\tmovs r2, 0\n"
"\tbl ChangeBgX\n"
"\tmovs r0, 0x1\n"
"\tmovs r1, 0\n"
"\tmovs r2, 0\n"
"\tbl ChangeBgY\n"
"\tldr r0, =gUnknown_08618110\n"
"\tbl InitWindows\n"
"\tbl DeactivateAllTextPrinters\n"
"\tldr r0, =sUnknown_08618138\n"
"\tstr r0, [r4]\n"
"\tldr r0, =0x050001e0\n"
"\tstr r0, [r4, 0x4]\n"
"\tldr r0, =0x84000008\n"
"\tstr r0, [r4, 0x8]\n"
"\tldr r0, [r4, 0x8]\n"
"\tmovs r0, 0\n"
"\tmovs r1, 0x40\n"
"\tbl SetGpuReg\n"
"\tmovs r0, 0x2\n"
"\tmovs r1, 0\n"
"\tbl FillWindowPixelBuffer\n"
"\tmovs r0, 0x3\n"
"\tmovs r1, 0\n"
"\tbl FillWindowPixelBuffer\n"
"\tmovs r0, 0\n"
"\tmovs r1, 0xAA\n"
"\tbl FillWindowPixelBuffer\n"
"\tldr r5, =sUnknown_08617E9B\n"
"\tmovs r0, 0\n"
"\tadds r1, r5, 0\n"
"\tmovs r2, 0\n"
"\tbl GetStringWidth\n"
"\tadds r1, r0, 0\n"
"\tmovs r4, 0x78\n"
"\tsubs r0, r4, r1\n"
"\tlsrs r1, r0, 31\n"
"\tadds r0, r1\n"
"\tasrs r0, 1\n"
"\tlsls r2, r0, 24\n"
"\tlsrs r2, 24\n"
"\tldr r6, =sUnknown_0861815B\n"
"\tstr r6, [sp]\n"
"\tmovs r0, 0x1\n"
"\tnegs r0, r0\n"
"\tmov r8, r0\n"
"\tstr r0, [sp, 0x4]\n"
"\tstr r5, [sp, 0x8]\n"
"\tmovs r0, 0x2\n"
"\tmovs r1, 0\n"
"\tmovs r3, 0x3\n"
"\tbl box_print\n"
"\tldr r5, =sUnknown_08617E8D\n"
"\tmovs r0, 0\n"
"\tadds r1, r5, 0\n"
"\tmovs r2, 0\n"
"\tbl GetStringWidth\n"
"\tadds r1, r0, 0\n"
"\tsubs r4, r1\n"
"\tlsrs r0, r4, 31\n"
"\tadds r4, r0\n"
"\tasrs r4, 1\n"
"\tadds r0, r4, 0\n"
"\tadds r0, 0x78\n"
"\tlsls r2, r0, 24\n"
"\tlsrs r2, 24\n"
"\tstr r6, [sp]\n"
"\tmov r0, r8\n"
"\tstr r0, [sp, 0x4]\n"
"\tstr r5, [sp, 0x8]\n"
"\tmovs r0, 0x2\n"
"\tmovs r1, 0\n"
"\tmovs r3, 0x3\n"
"\tbl box_print\n"
"\tmovs r0, 0\n"
"\tadds r1, r5, 0\n"
"\tmovs r2, 0\n"
"\tbl GetStringWidth\n"
"\tadds r1, r0, 0\n"
"\tmovs r0, 0x70\n"
"\tsubs r0, r1\n"
"\tlsrs r1, r0, 31\n"
"\tadds r0, r1\n"
"\tasrs r0, 1\n"
"\tlsls r2, r0, 24\n"
"\tlsrs r2, 24\n"
"\tstr r6, [sp]\n"
"\tmov r0, r8\n"
"\tstr r0, [sp, 0x4]\n"
"\tstr r5, [sp, 0x8]\n"
"\tmovs r0, 0x3\n"
"\tmovs r1, 0\n"
"\tmovs r3, 0\n"
"\tbl box_print\n"
"\tldr r4, =sUnknown_08617E78\n"
"\tmovs r0, 0x1\n"
"\tadds r1, r4, 0\n"
"\tmovs r2, 0\n"
"\tbl GetStringWidth\n"
"\tadds r1, r0, 0\n"
"\tmovs r0, 0xD0\n"
"\tsubs r0, r1\n"
"\tlsrs r1, r0, 31\n"
"\tadds r0, r1\n"
"\tasrs r0, 1\n"
"\tlsls r2, r0, 24\n"
"\tlsrs r2, 24\n"
"\tldr r0, =sUnknown_08618158\n"
"\tstr r0, [sp]\n"
"\tmov r0, r8\n"
"\tstr r0, [sp, 0x4]\n"
"\tstr r4, [sp, 0x8]\n"
"\tmovs r0, 0\n"
"\tmovs r1, 0x1\n"
"\tmovs r3, 0x2\n"
"\tbl box_print\n"
"\tmovs r0, 0x2\n"
"\tmovs r1, 0x2\n"
"\tbl CopyWindowToVram\n"
"\tmovs r0, 0x3\n"
"\tmovs r1, 0x2\n"
"\tbl CopyWindowToVram\n"
"\tmovs r0, 0\n"
"\tmovs r1, 0x2\n"
"\tbl CopyWindowToVram\n"
"\tadd sp, 0x10\n"
"\tpop {r3}\n"
"\tmov r8, r3\n"
"\tpop {r4-r6}\n"
"\tpop {r0}\n"
"\tbx r0\n"
"\t.pool\n"
".syntax divided");
}
#endif
static int berry_fix_text_update(int checkval)
{
if (berry_fix_mb_manager->unk1 == checkval)
@@ -522,7 +318,7 @@ static void berry_fix_text_print(int scene)
ShowBg(1);
}
static void berry_fix_bg_hide()
static void berry_fix_bg_hide(void)
{
HideBg(0);
HideBg(1);
+653
View File
@@ -0,0 +1,653 @@
#include "global.h"
#include "berry_tag_screen.h"
#include "berry.h"
#include "decompress.h"
#include "field_map_obj.h"
#include "item_menu.h"
#include "constants/items.h"
#include "item.h"
#include "item_use.h"
#include "main.h"
#include "menu.h"
#include "text.h"
#include "window.h"
#include "task.h"
#include "menu_helpers.h"
#include "palette.h"
#include "overworld.h"
#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
#include "string_util.h"
#include "strings.h"
#include "bg.h"
#include "malloc.h"
#include "scanline_effect.h"
#include "gpu_regs.h"
#include "graphics.h"
#include "item_menu_icons.h"
#include "decompress.h"
#include "international_string_util.h"
// There are 4 windows used in berry tag screen.
enum
{
WIN_BERRY_NAME,
WIN_SIZE_FIRM,
WIN_DESC,
WIN_BERRY_TAG
};
struct BerryTagScreenStruct
{
u16 tilemapBuffers[3][0x400];
u16 berryId;
u8 berrySpriteId;
u8 flavorCircleIds[FLAVOR_COUNT];
u16 gfxState;
};
// EWRAM vars
static EWRAM_DATA struct BerryTagScreenStruct *sBerryTag = NULL;
// const rom data
static const struct BgTemplate sBackgroundTemplates[] =
{
{
.bg = 0,
.charBaseIndex = 0,
.mapBaseIndex = 31,
.screenSize = 0,
.paletteMode = 0,
.priority = 0,
.baseTile = 0
},
{
.bg = 1,
.charBaseIndex = 0,
.mapBaseIndex = 30,
.screenSize = 0,
.paletteMode = 0,
.priority = 1,
.baseTile = 0
},
{
.bg = 2,
.charBaseIndex = 0,
.mapBaseIndex = 29,
.screenSize = 0,
.paletteMode = 0,
.priority = 2,
.baseTile = 0
},
{
.bg = 3,
.charBaseIndex = 0,
.mapBaseIndex = 28,
.screenSize = 0,
.paletteMode = 0,
.priority = 3,
.baseTile = 0
}
};
static const u16 sFontPalette[] = INCBIN_U16("graphics/interface/berry_tag_screen.gbapal");
static const u8 sTextColors[2][3] =
{
{0, 2, 3},
{15, 14, 13}
};
static const struct WindowTemplate sWindowTemplates[] =
{
{0x01, 0x0b, 0x04, 0x08, 0x02, 0x0f, 0x0045}, // WIN_BERRY_NAME
{0x01, 0x0b, 0x07, 0x12, 0x04, 0x0f, 0x0055}, // WIN_SIZE_FIRM
{0x01, 0x04, 0x0e, 0x19, 0x04, 0x0f, 0x009d}, // WIN_DESC
{0x00, 0x02, 0x00, 0x08, 0x02, 0x0f, 0x0101}, // WIN_BERRY_TAG
DUMMY_WIN_TEMPLATE
};
static const u8 *const sBerryFirmnessStrings[] =
{
gBerryFirmnessString_VerySoft,
gBerryFirmnessString_Soft,
gBerryFirmnessString_Hard,
gBerryFirmnessString_VeryHard,
gBerryFirmnessString_SuperHard
};
// this file's functions
static void CB2_InitBerryTagScreen(void);
static void HandleInitBackgrounds(void);
static void HandleInitWindows(void);
static void AddBerryTagTextToBg0(void);
static void PrintAllBerryData(void);
static void CreateBerrySprite(void);
static void CreateFlavorCircleSprites(void);
static void SetFlavorCirclesVisiblity(void);
static void PrintBerryNumberAndName(void);
static void PrintBerrySize(void);
static void PrintBerryFirmness(void);
static void PrintBerryDescription1(void);
static void PrintBerryDescription2(void);
static bool8 InitBerryTagScreen(void);
static bool8 LoadBerryTagGfx(void);
static void Task_HandleInput(u8 taskId);
static void Task_CloseBerryTagScreen(u8 taskId);
static void Task_DisplayAnotherBerry(u8 taskId);
static void TryChangeDisplayedBerry(u8 taskId, s8 toMove);
static void HandleBagCursorPositionChange(s8 toMove);
// code
void DoBerryTagScreen(void)
{
sBerryTag = AllocZeroed(sizeof(*sBerryTag));
sBerryTag->berryId = ItemIdToBerryType(gSpecialVar_ItemId);
SetMainCallback2(CB2_InitBerryTagScreen);
}
static void CB2_BerryTagScreen(void)
{
RunTasks();
AnimateSprites();
BuildOamBuffer();
do_scheduled_bg_tilemap_copies_to_vram();
UpdatePaletteFade();
}
static void VblankCB(void)
{
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
}
static void CB2_InitBerryTagScreen(void)
{
while (1)
{
if (sub_81221EC() == TRUE)
break;
if (InitBerryTagScreen() == TRUE)
break;
if (sub_81221AC() == TRUE)
break;
}
}
static bool8 InitBerryTagScreen(void)
{
switch (gMain.state)
{
case 0:
SetVBlankHBlankCallbacksToNull();
ResetVramOamAndBgCntRegs();
clear_scheduled_bg_copies_to_vram();
gMain.state++;
break;
case 1:
ScanlineEffect_Stop();
gMain.state++;
break;
case 2:
ResetPaletteFade();
gPaletteFade.bufferTransferDisabled = 1;
gMain.state++;
break;
case 3:
ResetSpriteData();
gMain.state++;
break;
case 4:
FreeAllSpritePalettes();
gMain.state++;
break;
case 5:
if (!sub_81221AC())
ResetTasks();
gMain.state++;
break;
case 6:
HandleInitBackgrounds();
sBerryTag->gfxState = 0;
gMain.state++;
break;
case 7:
if (LoadBerryTagGfx())
gMain.state++;
break;
case 8:
HandleInitWindows();
gMain.state++;
break;
case 9:
AddBerryTagTextToBg0();
gMain.state++;
break;
case 10:
PrintAllBerryData();
gMain.state++;
break;
case 11:
CreateBerrySprite();
gMain.state++;
break;
case 12:
CreateFlavorCircleSprites();
SetFlavorCirclesVisiblity();
gMain.state++;
break;
case 13:
CreateTask(Task_HandleInput, 0);
gMain.state++;
break;
case 14:
BlendPalettes(-1, 0x10, 0);
gMain.state++;
break;
case 15:
BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
gPaletteFade.bufferTransferDisabled = 0;
gMain.state++;
break;
default: // done
SetVBlankCallback(VblankCB);
SetMainCallback2(CB2_BerryTagScreen);
return TRUE;
}
return FALSE;
}
static void HandleInitBackgrounds(void)
{
ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(0, sBackgroundTemplates, ARRAY_COUNT(sBackgroundTemplates));
SetBgTilemapBuffer(2, sBerryTag->tilemapBuffers[0]);
SetBgTilemapBuffer(3, sBerryTag->tilemapBuffers[1]);
ResetAllBgsCoordinates();
schedule_bg_copy_tilemap_to_vram(2);
schedule_bg_copy_tilemap_to_vram(3);
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
SetGpuReg(REG_OFFSET_BLDCNT, 0);
ShowBg(0);
ShowBg(1);
ShowBg(2);
ShowBg(3);
}
static bool8 LoadBerryTagGfx(void)
{
u16 i;
switch (sBerryTag->gfxState)
{
case 0:
reset_temp_tile_data_buffers();
decompress_and_copy_tile_data_to_vram(2, gUnknown_08D9BB44, 0, 0, 0);
sBerryTag->gfxState++;
break;
case 1:
if (free_temp_tile_data_buffers_if_possible() != TRUE)
{
LZDecompressWram(gUnknown_08D9BF98, sBerryTag->tilemapBuffers[0]);
sBerryTag->gfxState++;
}
break;
case 2:
LZDecompressWram(gUnknown_08D9C13C, sBerryTag->tilemapBuffers[2]);
sBerryTag->gfxState++;
break;
case 3:
if (gSaveBlock2Ptr->playerGender == MALE)
{
for (i = 0; i < ARRAY_COUNT(sBerryTag->tilemapBuffers[1]); i++)
sBerryTag->tilemapBuffers[1][i] = 0x4042;
}
else
{
for (i = 0; i < ARRAY_COUNT(sBerryTag->tilemapBuffers[1]); i++)
sBerryTag->tilemapBuffers[1][i] = 0x5042;
}
sBerryTag->gfxState++;
break;
case 4:
LoadCompressedPalette(gUnknown_08D9BEF0, 0, 0xC0);
sBerryTag->gfxState++;
break;
case 5:
LoadCompressedObjectPic(&gUnknown_0857FDEC);
sBerryTag->gfxState++;
break;
default:
LoadCompressedObjectPalette(&gUnknown_0857FDF4);
return TRUE; // done
}
return FALSE;
}
static void HandleInitWindows(void)
{
u16 i;
InitWindows(sWindowTemplates);
DeactivateAllTextPrinters();
LoadPalette(sFontPalette, 0xF0, 0x20);
for (i = 0; i < ARRAY_COUNT(sWindowTemplates) - 1; i++)
PutWindowTilemap(i);
schedule_bg_copy_tilemap_to_vram(0);
schedule_bg_copy_tilemap_to_vram(1);
}
static void PrintTextInBerryTagScreen(u8 windowId, const u8 *text, u8 x, u8 y, s32 speed, u8 colorStructId)
{
AddTextPrinterParameterized2(windowId, 1, x, y, 0, 0, sTextColors[colorStructId], speed, text);
}
static void AddBerryTagTextToBg0(void)
{
memcpy(GetBgTilemapBuffer(0), sBerryTag->tilemapBuffers[2], sizeof(sBerryTag->tilemapBuffers[2]));
FillWindowPixelBuffer(WIN_BERRY_TAG, 0xFF);
PrintTextInBerryTagScreen(WIN_BERRY_TAG, gText_BerryTag, GetStringCenterAlignXOffset(1, gText_BerryTag, 0x40), 1, 0, 1);
PutWindowTilemap(WIN_BERRY_TAG);
schedule_bg_copy_tilemap_to_vram(0);
}
static void PrintAllBerryData(void)
{
PrintBerryNumberAndName();
PrintBerrySize();
PrintBerryFirmness();
PrintBerryDescription1();
PrintBerryDescription2();
}
static void PrintBerryNumberAndName(void)
{
const struct Berry *berry = GetBerryInfo(sBerryTag->berryId);
ConvertIntToDecimalStringN(gStringVar1, sBerryTag->berryId, 2, 2);
StringCopy(gStringVar2, berry->name);
StringExpandPlaceholders(gStringVar4, gText_UnkF908Var1Var2);
PrintTextInBerryTagScreen(WIN_BERRY_NAME, gStringVar4, 0, 1, 0, 0);
}
static void PrintBerrySize(void)
{
const struct Berry *berry = GetBerryInfo(sBerryTag->berryId);
PrintTextOnWindow(WIN_SIZE_FIRM, 1, gText_SizeSlash, 0, 1, TEXT_SPEED_FF, NULL);
if (berry->size != 0)
{
u32 inches, fraction;
inches = 1000 * berry->size / 254;
if (inches % 10 > 4)
inches += 10;
fraction = (inches % 100) / 10;
inches /= 100;
ConvertIntToDecimalStringN(gStringVar1, inches, 0, 2);
ConvertIntToDecimalStringN(gStringVar2, fraction, 0, 2);
StringExpandPlaceholders(gStringVar4, gText_Var1DotVar2);
PrintTextOnWindow(WIN_SIZE_FIRM, 1, gStringVar4, 0x28, 1, 0, NULL);
}
else
{
PrintTextOnWindow(WIN_SIZE_FIRM, 1, gText_ThreeMarks, 0x28, 1, 0, NULL);
}
}
static void PrintBerryFirmness(void)
{
const struct Berry *berry = GetBerryInfo(sBerryTag->berryId);
PrintTextOnWindow(WIN_SIZE_FIRM, 1, gText_FirmSlash, 0, 0x11, TEXT_SPEED_FF, NULL);
if (berry->firmness != 0)
PrintTextOnWindow(WIN_SIZE_FIRM, 1, sBerryFirmnessStrings[berry->firmness - 1], 0x28, 0x11, 0, NULL);
else
PrintTextOnWindow(WIN_SIZE_FIRM, 1, gText_ThreeMarks, 0x28, 0x11, 0, NULL);
}
static void PrintBerryDescription1(void)
{
const struct Berry *berry = GetBerryInfo(sBerryTag->berryId);
PrintTextOnWindow(WIN_DESC, 1, berry->description1, 0, 1, 0, NULL);
}
static void PrintBerryDescription2(void)
{
const struct Berry *berry = GetBerryInfo(sBerryTag->berryId);
PrintTextOnWindow(WIN_DESC, 1, berry->description2, 0, 0x11, 0, NULL);
}
static void CreateBerrySprite(void)
{
sBerryTag->berrySpriteId = CreateBerryTagSprite(sBerryTag->berryId - 1, 56, 64);
}
static void DestroyBerrySprite(void)
{
DestroySprite(&gSprites[sBerryTag->berrySpriteId]);
FreeBerryTagSpritePalette();
}
static void CreateFlavorCircleSprites(void)
{
sBerryTag->flavorCircleIds[FLAVOR_SPICY] = CreateBerryFlavorCircleSprite(64);
sBerryTag->flavorCircleIds[FLAVOR_DRY] = CreateBerryFlavorCircleSprite(104);
sBerryTag->flavorCircleIds[FLAVOR_SWEET] = CreateBerryFlavorCircleSprite(144);
sBerryTag->flavorCircleIds[FLAVOR_BITTER] = CreateBerryFlavorCircleSprite(184);
sBerryTag->flavorCircleIds[FLAVOR_SOUR] = CreateBerryFlavorCircleSprite(224);
}
static void SetFlavorCirclesVisiblity(void)
{
const struct Berry *berry = GetBerryInfo(sBerryTag->berryId);
if (berry->spicy)
gSprites[sBerryTag->flavorCircleIds[FLAVOR_SPICY]].invisible = 0;
else
gSprites[sBerryTag->flavorCircleIds[FLAVOR_SPICY]].invisible = 1;
if (berry->dry)
gSprites[sBerryTag->flavorCircleIds[FLAVOR_DRY]].invisible = 0;
else
gSprites[sBerryTag->flavorCircleIds[FLAVOR_DRY]].invisible = 1;
if (berry->sweet)
gSprites[sBerryTag->flavorCircleIds[FLAVOR_SWEET]].invisible = 0;
else
gSprites[sBerryTag->flavorCircleIds[FLAVOR_SWEET]].invisible = 1;
if (berry->bitter)
gSprites[sBerryTag->flavorCircleIds[FLAVOR_BITTER]].invisible = 0;
else
gSprites[sBerryTag->flavorCircleIds[FLAVOR_BITTER]].invisible = 1;
if (berry->sour)
gSprites[sBerryTag->flavorCircleIds[FLAVOR_SOUR]].invisible = 0;
else
gSprites[sBerryTag->flavorCircleIds[FLAVOR_SOUR]].invisible = 1;
}
static void DestroyFlavorCircleSprites(void)
{
u16 i;
for (i = 0; i < FLAVOR_COUNT; i++)
DestroySprite(&gSprites[sBerryTag->flavorCircleIds[i]]);
}
static void PrepareToCloseBerryTagScreen(u8 taskId)
{
PlaySE(SE_SELECT);
BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
gTasks[taskId].func = Task_CloseBerryTagScreen;
}
static void Task_CloseBerryTagScreen(u8 taskId)
{
if (!gPaletteFade.active)
{
DestroyBerrySprite();
DestroyFlavorCircleSprites();
Free(sBerryTag);
FreeAllWindowBuffers();
SetMainCallback2(bag_menu_mail_related);
DestroyTask(taskId);
}
}
static void Task_HandleInput(u8 taskId)
{
if (!gPaletteFade.active)
{
u16 arrowKeys = gMain.newAndRepeatedKeys & DPAD_ANY;
if (arrowKeys == DPAD_UP)
TryChangeDisplayedBerry(taskId, -1);
else if (arrowKeys == DPAD_DOWN)
TryChangeDisplayedBerry(taskId, 1);
else if (gMain.newKeys & (A_BUTTON | B_BUTTON))
PrepareToCloseBerryTagScreen(taskId);
}
}
static void TryChangeDisplayedBerry(u8 taskId, s8 toMove)
{
s16 *data = gTasks[taskId].data;
s16 currPocketPosition = gUnknown_0203CE58.unk12[3] + gUnknown_0203CE58.unk8[3];
u32 newPocketPosition = currPocketPosition + toMove;
if (newPocketPosition < 46 && BagGetItemIdByPocketPosition(BAG_BERRIES, newPocketPosition) != 0)
{
if (toMove < 0)
data[1] = 2;
else
data[1] = 1;
data[0] = 0;
PlaySE(SE_SELECT);
HandleBagCursorPositionChange(toMove);
gTasks[taskId].func = Task_DisplayAnotherBerry;
}
}
static void HandleBagCursorPositionChange(s8 toMove)
{
u16 *scrollPos = &gUnknown_0203CE58.unk12[3];
u16 *cursorPos = &gUnknown_0203CE58.unk8[3];
if (toMove > 0)
{
if (*cursorPos < 4 || BagGetItemIdByPocketPosition(BAG_BERRIES, *scrollPos + 8) == 0)
*cursorPos += toMove;
else
*scrollPos += toMove;
}
else
{
if (*cursorPos > 3 || *scrollPos == 0)
*cursorPos += toMove;
else
*scrollPos += toMove;
}
sBerryTag->berryId = ItemIdToBerryType(BagGetItemIdByPocketPosition(BAG_BERRIES, *scrollPos + *cursorPos));
}
static void Task_DisplayAnotherBerry(u8 taskId)
{
u16 i;
s16 posY;
s16 *data = gTasks[taskId].data;
data[0] += 0x10;
data[0] &= 0xFF;
if (data[1] == 1)
{
switch (data[0])
{
case 0x30:
FillWindowPixelBuffer(0, 0);
break;
case 0x40:
PrintBerryNumberAndName();
break;
case 0x50:
DestroyBerrySprite();
CreateBerrySprite();
break;
case 0x60:
FillWindowPixelBuffer(1, 0);
break;
case 0x70:
PrintBerrySize();
break;
case 0x80:
PrintBerryFirmness();
break;
case 0x90:
SetFlavorCirclesVisiblity();
break;
case 0xA0:
FillWindowPixelBuffer(2, 0);
break;
case 0xB0:
PrintBerryDescription1();
break;
case 0xC0:
PrintBerryDescription2();
break;
}
}
else
{
switch (data[0])
{
case 0x30:
FillWindowPixelBuffer(2, 0);
break;
case 0x40:
PrintBerryDescription2();
break;
case 0x50:
PrintBerryDescription1();
break;
case 0x60:
SetFlavorCirclesVisiblity();
break;
case 0x70:
FillWindowPixelBuffer(1, 0);
break;
case 0x80:
PrintBerryFirmness();
break;
case 0x90:
PrintBerrySize();
break;
case 0xA0:
DestroyBerrySprite();
CreateBerrySprite();
break;
case 0xB0:
FillWindowPixelBuffer(0, 0);
break;
case 0xC0:
PrintBerryNumberAndName();
break;
}
}
if (data[1] == 1)
posY = -data[0];
else
posY = data[0];
gSprites[sBerryTag->berrySpriteId].pos2.y = posY;
for (i = 0; i < FLAVOR_COUNT; i++)
gSprites[sBerryTag->flavorCircleIds[i]].pos2.y = posY;
ChangeBgY(1, 0x1000, data[1]);
ChangeBgY(2, 0x1000, data[1]);
if (data[0] == 0)
gTasks[taskId].func = Task_HandleInput;
}
+16 -24
View File
@@ -1,6 +1,7 @@
#include "global.h"
#include "constants/abilities.h"
#include "battle.h"
#include "battle_setup.h"
#include "constants/hold_effects.h"
#include "event_data.h"
#include "item.h"
@@ -10,15 +11,6 @@
#include "constants/moves.h"
#include "constants/battle_move_effects.h"
extern u32 gBattleTypeFlags;
extern struct BattlePokemon gBattleMons[4];
extern u16 gCurrentMove;
extern u8 gCritMultiplier;
extern u16 gBattleWeather;
extern struct BattleEnigmaBerry gEnigmaBerries[];
extern u16 gBattleMovePower;
extern u16 gTrainerBattleOpponent_A;
bool8 ShouldGetStatBadgeBoost(u16 flagId, u8 bank);
extern const struct BattleMove gBattleMoves[];
@@ -149,35 +141,35 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
if (gBattleMoves[gCurrentMove].effect == EFFECT_EXPLOSION)
defense /= 2;
if (type < TYPE_MYSTERY) // is physical
if (IS_MOVE_PHYSICAL(type))
{
if (gCritMultiplier == 2)
{
if (attacker->statStages[STAT_STAGE_ATK] > 6)
APPLY_STAT_MOD(damage, attacker, attack, STAT_STAGE_ATK)
if (attacker->statStages[STAT_ATK] > 6)
APPLY_STAT_MOD(damage, attacker, attack, STAT_ATK)
else
damage = attack;
}
else
APPLY_STAT_MOD(damage, attacker, attack, STAT_STAGE_ATK)
APPLY_STAT_MOD(damage, attacker, attack, STAT_ATK)
damage = damage * gBattleMovePower;
damage *= (2 * attacker->level / 5 + 2);
if (gCritMultiplier == 2)
{
if (defender->statStages[STAT_STAGE_DEF] < 6)
APPLY_STAT_MOD(damageHelper, defender, defense, STAT_STAGE_DEF)
if (defender->statStages[STAT_DEF] < 6)
APPLY_STAT_MOD(damageHelper, defender, defense, STAT_DEF)
else
damageHelper = defense;
}
else
APPLY_STAT_MOD(damageHelper, defender, defense, STAT_STAGE_DEF)
APPLY_STAT_MOD(damageHelper, defender, defense, STAT_DEF)
damage = damage / damageHelper;
damage /= 50;
if ((attacker->status1 & STATUS_BURN) && attacker->ability != ABILITY_GUTS)
if ((attacker->status1 & STATUS1_BURN) && attacker->ability != ABILITY_GUTS)
damage /= 2;
if ((sideStatus & SIDE_STATUS_REFLECT) && gCritMultiplier == 1)
@@ -199,30 +191,30 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
if (type == TYPE_MYSTERY)
damage = 0; // is ??? type. does 0 damage.
if (type > TYPE_MYSTERY) // is special?
if (IS_MOVE_SPECIAL(type))
{
if (gCritMultiplier == 2)
{
if (attacker->statStages[STAT_STAGE_SPATK] > 6)
APPLY_STAT_MOD(damage, attacker, spAttack, STAT_STAGE_SPATK)
if (attacker->statStages[STAT_SPATK] > 6)
APPLY_STAT_MOD(damage, attacker, spAttack, STAT_SPATK)
else
damage = spAttack;
}
else
APPLY_STAT_MOD(damage, attacker, spAttack, STAT_STAGE_SPATK)
APPLY_STAT_MOD(damage, attacker, spAttack, STAT_SPATK)
damage = damage * gBattleMovePower;
damage *= (2 * attacker->level / 5 + 2);
if (gCritMultiplier == 2)
{
if (defender->statStages[STAT_STAGE_SPDEF] < 6)
APPLY_STAT_MOD(damageHelper, defender, spDefense, STAT_STAGE_SPDEF)
if (defender->statStages[STAT_SPDEF] < 6)
APPLY_STAT_MOD(damageHelper, defender, spDefense, STAT_SPDEF)
else
damageHelper = spDefense;
}
else
APPLY_STAT_MOD(damageHelper, defender, spDefense, STAT_STAGE_SPDEF)
APPLY_STAT_MOD(damageHelper, defender, spDefense, STAT_SPDEF)
damage = (damage / damageHelper);
damage /= 50;
-2
View File
@@ -14,8 +14,6 @@
extern u8 gText_ClearAllSaveData[];
extern u8 gText_ClearingData[];
extern u16 gUnknown_0860F074[];
static void Task_DoClearSaveDataScreenYesNo(u8);
static void Task_ClearSaveDataScreenYesNoChoice(u8);
static void Task_ClearSaveData(u8);
-1
View File
@@ -4,7 +4,6 @@
#include "window.h"
#include "strings.h"
#include "string_util.h"
#include "new_menu_helpers.h"
#include "menu.h"
#include "international_string_util.h"
+5 -5
View File
@@ -43,7 +43,7 @@ extern u16 ItemIdToBattleMoveId(u16);
extern s32 ListMenuHandleInputGetItemId(u8);
extern void sub_81AE6C8(u8, u16*, u16*);
extern void sub_819746C(u8, bool8);
extern void sub_81973FC(u8, bool8);
extern void NewMenuHelpers_DrawStdWindowFrame(u8, bool8);
extern void sub_81B9328(void);
extern void sub_81AF078(u32, bool8, struct ListMenu *);
extern void c2_exit_to_overworld_2_switch(void);
@@ -413,7 +413,7 @@ static u16 GetEggSpecies(u16 species)
{
for (k = 0; k < EVOS_PER_MON; k++)
{
if (gEvolutionTable[j].evolutions[k].targetSpecies == species)
if (gEvolutionTable[j][k].targetSpecies == species)
{
species = j;
found = TRUE;
@@ -694,7 +694,7 @@ static void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, stru
{
for (j = 0; j < NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES; j++)
{
if (sHatchedEggFatherMoves[i] == ItemIdToBattleMoveId(ITEM_TM01 + j) && CanMonLearnTMHM(egg, j))
if (sHatchedEggFatherMoves[i] == ItemIdToBattleMoveId(ITEM_TM01_FOCUS_PUNCH + j) && CanMonLearnTMHM(egg, j))
{
if (GiveMoveToMon(egg, sHatchedEggFatherMoves[i]) == 0xffff)
DeleteFirstMoveAndGiveMoveToMon(egg, sHatchedEggFatherMoves[i]);
@@ -1212,7 +1212,7 @@ static void DaycareAddTextPrinter(u8 windowId, const u8 *text, u32 x, u32 y)
gTextFlags.flag_1 = 0;
printer.letterSpacing = 0;
printer.lineSpacing = 1;
printer.fontColor_h = 2;
printer.fgColor = 2;
printer.bgColor = 1;
printer.shadowColor = 3;
@@ -1296,7 +1296,7 @@ void ShowDaycareLevelMenu(void)
u8 daycareMenuTaskId;
windowId = AddWindow(&sDaycareLevelMenuWindowTemplate);
sub_81973FC(windowId, FALSE);
NewMenuHelpers_DrawStdWindowFrame(windowId, FALSE);
menuTemplate = sDaycareListMenuLevelTemplate;
menuTemplate.unk_10 = windowId;
+7 -7
View File
@@ -20,7 +20,7 @@
#include "field_map_obj.h"
#include "list_menu.h"
#include "menu_helpers.h"
#include "new_menu_helpers.h"
#include "menu.h"
#include "menu_indicators.h"
#include "sound.h"
#include "event_scripts.h"
@@ -727,7 +727,7 @@ void sub_81271CC(u8 taskId)
{
sub_8126A58(1);
sub_8126A88();
sub_81973C4(0, 0);
NewMenuHelpers_DrawDialogueFrame(0, 0);
sub_8126C08();
gTasks[taskId].func = sub_8126B80;
}
@@ -2013,9 +2013,9 @@ u8 AddDecorationIconObjectFromIconTable(u16 tilesTag, u16 paletteTag, u8 decor)
{
return MAX_SPRITES;
}
LZDecompressWram(GetDecorationIconPicOrPalette(decor, 0), gUnknown_0203CEBC);
CopyItemIconPicTo4x4Buffer(gUnknown_0203CEBC, gUnknown_0203CEC0);
sheet.data = gUnknown_0203CEC0;
LZDecompressWram(GetDecorationIconPicOrPalette(decor, 0), gItemIconDecompressionBuffer);
CopyItemIconPicTo4x4Buffer(gItemIconDecompressionBuffer, gItemIcon4x4Buffer);
sheet.data = gItemIcon4x4Buffer;
sheet.size = 0x200;
sheet.tag = tilesTag;
LoadSpriteSheet(&sheet);
@@ -2023,7 +2023,7 @@ u8 AddDecorationIconObjectFromIconTable(u16 tilesTag, u16 paletteTag, u8 decor)
palette.tag = paletteTag;
LoadCompressedObjectPalette(&palette);
template = malloc(sizeof(struct SpriteTemplate));
*template = gUnknown_08614FF4;
*template = gItemIconSpriteTemplate;
template->tileTag = tilesTag;
template->paletteTag = paletteTag;
spriteId = CreateSprite(template, 0, 0, 0);
@@ -2712,7 +2712,7 @@ void sub_812A334(void)
u8 taskId;
pal_fill_black();
sub_81973C4(0, 1);
NewMenuHelpers_DrawDialogueFrame(0, 1);
sub_8126ABC();
taskId = CreateTask(sub_812A2C4, 8);
gTasks[taskId].data[2] = 0;
+3 -8
View File
@@ -17,7 +17,7 @@ extern int decompress_and_copy_tile_data_to_vram(u8 bg_id, void *src, int size,
extern bool8 free_temp_tile_data_buffers_if_possible(void);
extern void sub_80861E8(void); // rom4
extern bool16 sub_80C0944(void);
extern void AddTextPrinterParameterized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, struct TextColor *color, s8 speed, u8 *str);
extern void AddTextPrinterParameterized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 *color, s8 speed, u8 *str);
extern u16 gUnknown_0860F074[];
@@ -208,12 +208,7 @@ static void InitDiplomaWindow(void)
static void PrintDiplomaText(u8 *text, u8 var1, u8 var2)
{
struct TextColor color =
{
.fgColor = 0,
.bgColor = 2,
.shadowColor = 3,
};
u8 color[3] = {0, 2, 3};
AddTextPrinterParameterized2(0, 1, var1, var2, 0, 0, &color, -1, text);
AddTextPrinterParameterized2(0, 1, var1, var2, 0, 0, color, -1, text);
}
+1 -1
View File
@@ -204,7 +204,7 @@ s16 RequestDma3Fill(s32 value, void *dest, u16 size, u8 mode)
return -1; // no free DMA request was found
}
int CheckForSpaceForDma3Request(s16 index)
s16 CheckForSpaceForDma3Request(s16 index)
{
int i = 0;
+5 -5
View File
@@ -41,7 +41,7 @@ struct EggHatchData
u8 unused_9;
u8 unused_A;
u16 species;
struct TextColor textColor;
u8 textColor[3];
};
extern struct SpriteTemplate gUnknown_0202499C;
@@ -857,10 +857,10 @@ static void CreateEggShardSprite(u8 x, u8 y, s16 data1, s16 data2, s16 data3, u8
static void EggHatchPrintMessage(u8 windowId, u8* string, u8 x, u8 y, u8 speed)
{
FillWindowPixelBuffer(windowId, 0xFF);
sEggHatchData->textColor.fgColor = 0;
sEggHatchData->textColor.bgColor = 5;
sEggHatchData->textColor.shadowColor = 6;
AddTextPrinterParameterized2(windowId, 1, x, y, 0, 0, &sEggHatchData->textColor, speed, string);
sEggHatchData->textColor[0] = 0;
sEggHatchData->textColor[1] = 5;
sEggHatchData->textColor[2] = 6;
AddTextPrinterParameterized2(windowId, 1, x, y, 0, 0, sEggHatchData->textColor, speed, string);
}
u8 GetEggStepsToSubtract(void)
+16 -17
View File
@@ -21,7 +21,7 @@
#include "constants/songs.h"
#include "overworld.h"
#include "battle_message.h"
#include "battle_string_ids.h"
#include "constants/battle_string_ids.h"
#include "gpu_regs.h"
#include "bg.h"
#include "link.h"
@@ -48,13 +48,11 @@ extern u16 gBattle_BG2_X;
extern u16 gBattle_BG2_Y;
extern u16 gBattle_BG3_X;
extern u16 gBattle_BG3_Y;
extern u8 gBattleTerrain;
extern struct SpriteTemplate gUnknown_0202499C;
extern bool8 gAffineAnimsDisabled;
extern u16 gMoveToLearn;
extern const u8 gSpeciesNames[][11];
extern u8 gBattleCommunication[];
#define sEvoCursorPos gBattleCommunication[1] // when learning a new move
#define sEvoGraphicsTaskID gBattleCommunication[2]
@@ -110,7 +108,7 @@ static const u16 sUnknown_085B5884[] = INCBIN_U16("graphics/evolution_scene/tran
static const u8 Text_ShedinjaJapaneseName[] = _("ヌケニン");
static const u8 sUnknown_085B58C9[][4] =
static const u8 sUnknown_085B58C9[][4] =
{
{ 0x00, 0x0C, 0x01, 0x06 },
{ 0x0D, 0x24, 0x05, 0x02 },
@@ -572,16 +570,16 @@ static void CB2_TradeEvolutionSceneUpdate(void)
static void CreateShedinja(u16 preEvoSpecies, struct Pokemon* mon)
{
u32 data = 0;
if (gEvolutionTable[preEvoSpecies].evolutions[0].method == EVO_LEVEL_NINJASK && gPlayerPartyCount < 6)
if (gEvolutionTable[preEvoSpecies][0].method == EVO_LEVEL_NINJASK && gPlayerPartyCount < 6)
{
s32 i;
struct Pokemon* Shedinja = &gPlayerParty[gPlayerPartyCount];
const struct EvolutionData* evoTable;
const struct EvolutionData* evos;
struct Pokemon* shedinja = &gPlayerParty[gPlayerPartyCount];
const struct Evolution *evos;
const struct Evolution *evos2;
CopyMon(&gPlayerParty[gPlayerPartyCount], mon, sizeof(struct Pokemon));
SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, (&gEvolutionTable[preEvoSpecies].evolutions[1].targetSpecies));
SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_NICKNAME, (gSpeciesNames[gEvolutionTable[preEvoSpecies].evolutions[1].targetSpecies]));
SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, (&gEvolutionTable[preEvoSpecies][1].targetSpecies));
SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_NICKNAME, (gSpeciesNames[gEvolutionTable[preEvoSpecies][1].targetSpecies]));
SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_HELD_ITEM, (&data));
SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_MARKINGS, (&data));
SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_10, (&data));
@@ -599,15 +597,16 @@ static void CreateShedinja(u16 preEvoSpecies, struct Pokemon* mon)
CalculatePlayerPartyCount();
// can't match it otherwise, ehh
evoTable = gEvolutionTable;
evos = evoTable + preEvoSpecies;
GetSetPokedexFlag(SpeciesToNationalPokedexNum(evos->evolutions[1].targetSpecies), FLAG_SET_SEEN);
GetSetPokedexFlag(SpeciesToNationalPokedexNum(evos->evolutions[1].targetSpecies), FLAG_SET_CAUGHT);
evos2 = gEvolutionTable[0];
evos = evos2 + EVOS_PER_MON * preEvoSpecies;
if (GetMonData(Shedinja, MON_DATA_SPECIES) == SPECIES_SHEDINJA
&& GetMonData(Shedinja, MON_DATA_LANGUAGE) == LANGUAGE_JAPANESE
GetSetPokedexFlag(SpeciesToNationalPokedexNum(evos[1].targetSpecies), FLAG_SET_SEEN);
GetSetPokedexFlag(SpeciesToNationalPokedexNum(evos[1].targetSpecies), FLAG_SET_CAUGHT);
if (GetMonData(shedinja, MON_DATA_SPECIES) == SPECIES_SHEDINJA
&& GetMonData(shedinja, MON_DATA_LANGUAGE) == LANGUAGE_JAPANESE
&& GetMonData(mon, MON_DATA_SPECIES) == SPECIES_NINJASK)
SetMonData(Shedinja, MON_DATA_NICKNAME, Text_ShedinjaJapaneseName);
SetMonData(shedinja, MON_DATA_NICKNAME, Text_ShedinjaJapaneseName);
}
}
+4 -4
View File
@@ -549,14 +549,14 @@ bool32 sub_8097E50(struct MapObject *mapObject, struct Sprite *sprite)
{
if (firstFreeSlot == 16 && gUnknown_020375B8[i] == 0)
firstFreeSlot = i;
if (gUnknown_020375B8[i] == mapObject->localId)
{
found = TRUE;
break;
}
}
if (!found && firstFreeSlot != 16)
{
gUnknown_020375B8[firstFreeSlot] = mapObject->localId;
@@ -564,13 +564,13 @@ bool32 sub_8097E50(struct MapObject *mapObject, struct Sprite *sprite)
ableToStore = TRUE; // the nonmatching problem is that ableToStore == TRUE isnt being merged with the above ableToStore = TRUE assignment.
}
}
if (ableToStore == TRUE)
{
mapObject->mapobj_bit_12 = TRUE;
mapObject->mapobj_bit_9 = TRUE;
}
sprite->data[2] = 1;
return TRUE;
}
+4 -3
View File
@@ -1,9 +1,10 @@
#include "global.h"
#include "new_menu_helpers.h"
#include "menu.h"
#include "string.h"
#include "string_util.h"
#include "task.h"
#include "text.h"
#include "battle_frontier_1.h"
EWRAM_DATA u8 gUnknown_020375BC = 0;
@@ -30,7 +31,7 @@ void sub_8098154(u8 taskId)
task->data[0]++;
break;
case 1:
sub_81973C4(0, 1);
NewMenuHelpers_DrawDialogueFrame(0, 1);
task->data[0]++;
break;
case 2:
@@ -143,7 +144,7 @@ bool8 IsFieldMessageBoxHidden(void)
void sub_8098358(void)
{
task_del_textbox();
sub_81973FC(0, 1);
NewMenuHelpers_DrawStdWindowFrame(0, 1);
gUnknown_020375BC = 0;
}
+1 -1
View File
@@ -42,7 +42,7 @@ static bool32 sub_80F958C(void)
static void sub_80F95C0(u8 partyIdx)
{
struct Pokemon *pokemon = gPlayerParty + partyIdx;
unsigned int status = STATUS_NONE;
unsigned int status = STATUS1_NONE;
AdjustFriendship(pokemon, 0x07);
SetMonData(pokemon, MON_DATA_STATUS, &status);
GetMonData(pokemon, MON_DATA_NICKNAME, gStringVar1);
+5 -5
View File
@@ -25,7 +25,7 @@
#include "random.h"
#include "event_data.h"
#include "overworld.h"
#include "new_menu_helpers.h"
#include "menu.h"
struct HallofFameMon
{
@@ -81,7 +81,7 @@ extern const u8 gText_MainMenuTime[];
extern const u8 gContestConfetti_Gfx[];
extern const u8 gContestConfetti_Pal[];
extern void sub_81973C4(u8, u8);
extern void NewMenuHelpers_DrawDialogueFrame(u8, u8);
extern void sub_8175620(void);
extern u8 TrySavingData(u8);
extern u8 sub_818D3E4(u16 species, u32 trainerId, u32 personality, u8 flags, s16 x, s16 y, u8, u16);
@@ -538,7 +538,7 @@ static void Task_Hof_InitTeamSaveData(u8 taskId)
}
*lastSavedTeam = *sHofMonPtr;
sub_81973C4(0, 0);
NewMenuHelpers_DrawDialogueFrame(0, 0);
AddTextPrinterParameterized(0, 1, gText_SavingDontTurnOffPower, 0, NULL, 2, 1, 3);
CopyWindowToVram(0, 3);
gTasks[taskId].func = Task_Hof_TrySaveData;
@@ -745,7 +745,7 @@ static void Task_Hof_WaitAndPrintPlayerInfo(u8 taskId)
{
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x20, 0x20);
HallOfFame_PrintPlayerInfo(1, 2);
sub_81973C4(0, 0);
NewMenuHelpers_DrawDialogueFrame(0, 0);
AddTextPrinterParameterized(0, 1, gText_LeagueChamp, 0, NULL, 2, 1, 3);
CopyWindowToVram(0, 3);
gTasks[taskId].func = Task_Hof_ExitOnKeyPressed;
@@ -1114,7 +1114,7 @@ static void Task_HofPC_HandleExit(u8 taskId)
static void Task_HofPC_PrintDataIsCorrupted(u8 taskId)
{
sub_8198180(gText_UnkCtrlF800Exit, 8, 1);
sub_81973C4(0, 0);
NewMenuHelpers_DrawDialogueFrame(0, 0);
AddTextPrinterParameterized(0, 1, gText_HOFCorrupted, 0, NULL, 2, 1, 3);
CopyWindowToVram(0, 3);
gTasks[taskId].func = Task_HofPC_ExitOnButtonPress;
+169
View File
@@ -0,0 +1,169 @@
#include "global.h"
#include "item_icon.h"
#include "malloc.h"
#include "sprite.h"
#include "decompress.h"
#include "constants/items.h"
// EWRAM vars
EWRAM_DATA void *gItemIconDecompressionBuffer = NULL;
EWRAM_DATA void *gItemIcon4x4Buffer = NULL;
// const rom data
extern const void *const gItemIconTable[][2]; // todo: move to C file
static const struct OamData sOamData_ItemIcon =
{
.y = 0,
.affineMode = 0,
.objMode = 0,
.mosaic = 0,
.bpp = 0,
.shape = 0,
.x = 0,
.matrixNum = 0,
.size = 2,
.tileNum = 0,
.priority = 1,
.paletteNum = 2,
.affineParam = 0
};
static const union AnimCmd sSpriteAnim_ItemIcon[] =
{
ANIMCMD_FRAME(0, 0),
ANIMCMD_END
};
static const union AnimCmd *const sSpriteAnimTable_ItemIcon[] =
{
sSpriteAnim_ItemIcon
};
const struct SpriteTemplate gItemIconSpriteTemplate =
{
.tileTag = 0,
.paletteTag = 0,
.oam = &sOamData_ItemIcon,
.anims = sSpriteAnimTable_ItemIcon,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy,
};
// code
bool8 AllocItemIconTemporaryBuffers(void)
{
gItemIconDecompressionBuffer = gItemIconDecompressionBuffer; // needed to match
gItemIconDecompressionBuffer = Alloc(0x120);
if (gItemIconDecompressionBuffer == NULL)
return FALSE;
gItemIcon4x4Buffer = gItemIcon4x4Buffer; // needed to match
gItemIcon4x4Buffer = AllocZeroed(0x200);
if (gItemIcon4x4Buffer == NULL)
{
Free(gItemIconDecompressionBuffer);
return FALSE;
}
return TRUE;
}
void FreeItemIconTemporaryBuffers(void)
{
Free(gItemIconDecompressionBuffer);
Free(gItemIcon4x4Buffer);
}
void CopyItemIconPicTo4x4Buffer(const void *src, void *dest)
{
u8 i;
for (i = 0; i < 3; i++)
CpuCopy16(src + i * 96, dest + i * 128, 0x60);
}
u8 AddItemIconSprite(u16 tilesTag, u16 paletteTag, u16 itemId)
{
if (!AllocItemIconTemporaryBuffers())
{
return MAX_SPRITES;
}
else
{
u8 spriteId;
struct SpriteSheet spriteSheet;
struct CompressedSpritePalette spritePalette;
struct SpriteTemplate *spriteTemplate;
LZDecompressWram(GetItemIconPicOrPalette(itemId, 0), gItemIconDecompressionBuffer);
CopyItemIconPicTo4x4Buffer(gItemIconDecompressionBuffer, gItemIcon4x4Buffer);
spriteSheet.data = gItemIcon4x4Buffer;
spriteSheet.size = 0x200;
spriteSheet.tag = tilesTag;
LoadSpriteSheet(&spriteSheet);
spritePalette.data = GetItemIconPicOrPalette(itemId, 1);
spritePalette.tag = paletteTag;
LoadCompressedObjectPalette(&spritePalette);
spriteTemplate = Alloc(sizeof(*spriteTemplate));
CpuCopy16(&gItemIconSpriteTemplate, spriteTemplate, sizeof(*spriteTemplate));
spriteTemplate->tileTag = tilesTag;
spriteTemplate->paletteTag = paletteTag;
spriteId = CreateSprite(spriteTemplate, 0, 0, 0);
FreeItemIconTemporaryBuffers();
Free(spriteTemplate);
return spriteId;
}
}
u8 AddCustomItemIconSprite(struct SpriteTemplate *customSpriteTemplate, u16 tilesTag, u16 paletteTag, u16 itemId)
{
if (!AllocItemIconTemporaryBuffers())
{
return MAX_SPRITES;
}
else
{
u8 spriteId;
struct SpriteSheet spriteSheet;
struct CompressedSpritePalette spritePalette;
struct SpriteTemplate *spriteTemplate;
LZDecompressWram(GetItemIconPicOrPalette(itemId, 0), gItemIconDecompressionBuffer);
CopyItemIconPicTo4x4Buffer(gItemIconDecompressionBuffer, gItemIcon4x4Buffer);
spriteSheet.data = gItemIcon4x4Buffer;
spriteSheet.size = 0x200;
spriteSheet.tag = tilesTag;
LoadSpriteSheet(&spriteSheet);
spritePalette.data = GetItemIconPicOrPalette(itemId, 1);
spritePalette.tag = paletteTag;
LoadCompressedObjectPalette(&spritePalette);
spriteTemplate = Alloc(sizeof(*spriteTemplate));
CpuCopy16(customSpriteTemplate, spriteTemplate, sizeof(*spriteTemplate));
spriteTemplate->tileTag = tilesTag;
spriteTemplate->paletteTag = paletteTag;
spriteId = CreateSprite(spriteTemplate, 0, 0, 0);
FreeItemIconTemporaryBuffers();
Free(spriteTemplate);
return spriteId;
}
}
const void *GetItemIconPicOrPalette(u16 itemId, u8 which)
{
if (itemId == 0xFFFF)
itemId = ITEM_FIELD_ARROW;
else if (itemId > ITEM_LAST_ID)
itemId = 0;
return gItemIconTable[itemId][which];
}
+13 -162
View File
@@ -1,4 +1,5 @@
#include "global.h"
#include "item_use.h"
#include "battle.h"
#include "berry.h"
#include "bike.h"
@@ -28,7 +29,6 @@
#include "task.h"
#include "text.h"
extern u16 gSpecialVar_ItemId;
extern void(**gUnknown_0203CE54)(void);
extern void(**gUnknown_0203CF2C)(void);
extern void(*gUnknown_0203A0F4)(u8 taskId);
@@ -88,13 +88,12 @@ extern void sub_80B7CC8(void);
extern void flagmods_08054D70(void);
extern u8* sub_806CF78(u16);
extern bool8 ExecuteTableBasedItemEffect_(struct Pokemon*, u16, u8, u8);
extern u8 gBankInMenu;
extern u16 gBattlePartyID[];
extern void sub_81B89F0(void);
extern u8 GetItemEffectType(u16);
extern struct MapConnection *sub_8088A8C(s16, s16);
void MapPostLoadHook_UseItem(void);
extern void sub_80AF6D4(void);
void sub_80AF6D4(void);
void Task_CallItemUseOnFieldCallback(u8 taskId);
void bag_menu_inits_lists_menu(u8 taskId);
void ItemUseOnFieldCB_Bike(u8 taskId);
@@ -379,12 +378,12 @@ bool8 ItemfinderCheckForHiddenItems(struct MapEvents *events, u8 taskId)
newDistanceX = distanceX - x;
distanceY = (u16)events->bgEvents[i].y + 7;
newDistanceY = distanceY - y;
if ((u16)(newDistanceX + 7) < 15 && (newDistanceY >= -5) && (newDistanceY < 6))
sub_80FD8E0(taskId, newDistanceX, newDistanceY);
}
}
sub_80FD7C8(taskId);
if (gTasks[taskId].data[2] == TRUE)
return TRUE;
@@ -453,8 +452,6 @@ bool8 sub_80FD730(struct MapConnection *connection, int x, int y)
return sub_80FD6D4(mapHeader->events, localX, localY);
}
// weird math
#ifdef NONMATCHING
void sub_80FD7C8(u8 taskId)
{
s16 x, y;
@@ -462,15 +459,18 @@ void sub_80FD7C8(u8 taskId)
s16 width = gMapHeader.mapData->width + 7;
s16 height = gMapHeader.mapData->height + 7;
s16 var1 = 7;
s16 var2 = 7;
PlayerGetDestCoords(&x, &y);
for (curX = x - 7; curX <= x + 7; curX++)
{
for (curY = y - 5; curY <= y + 5; curY++)
{
if (7 > curX
if (var1 > curX
|| curX >= width
|| 7 > curY
|| var2 > curY
|| curY >= height)
{
struct MapConnection *conn = sub_8088A8C(curX, curY);
@@ -480,155 +480,6 @@ void sub_80FD7C8(u8 taskId)
}
}
}
#else
__attribute__((naked))
void sub_80FD7C8(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, =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 _080FD8CC\n\
_080FD816:\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 _080FD8B6\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\
_080FD83E:\n\
ldr r3, [sp, 0x10]\n\
cmp r3, r9\n\
bgt _080FD860\n\
ldr r5, [sp, 0x8]\n\
lsls r0, r5, 16\n\
asrs r0, 16\n\
cmp r9, r0\n\
bge _080FD860\n\
asrs r1, r2, 16\n\
cmp r10, r1\n\
bgt _080FD860\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 _080FD89E\n\
_080FD860:\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_8088A8C\n\
adds r7, r4, 0\n\
cmp r0, 0\n\
beq _080FD89E\n\
adds r1, r5, 0\n\
adds r2, r6, 0\n\
bl sub_80FD730\n\
lsls r0, 24\n\
lsrs r0, 24\n\
cmp r0, 0x1\n\
bne _080FD89E\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_80FD8E0\n\
_080FD89E:\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 _080FD83E\n\
_080FD8B6:\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 _080FD816\n\
_080FD8CC:\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\
.pool\n\
.syntax divided\n");
}
#endif
void sub_80FD8E0(u8 taskId, s16 x, s16 y)
{
@@ -929,7 +780,7 @@ void ItemUseOutOfBattle_RareCandy(u8 taskId)
void ItemUseOutOfBattle_TMHM(u8 taskId)
{
if (gSpecialVar_ItemId >= ITEM_HM01)
if (gSpecialVar_ItemId >= ITEM_HM01_CUT)
DisplayItemMessage(taskId, 1, gText_BootedUpHM, sub_80FDF90); // HM
else
DisplayItemMessage(taskId, 1, gText_BootedUpTM, sub_80FDF90); // TM
@@ -992,7 +843,7 @@ void ItemUseOutOfBattle_Repel(u8 taskId)
void sub_80FE124(u8 taskId)
{
s16* data = gTasks[taskId].data;
if (++data[8] > 7)
{
data[8] = 0;
@@ -1131,7 +982,7 @@ void sub_80FE440(u8 taskId)
void ItemUseInBattle_StatIncrease(u8 taskId)
{
u16 partyId = gBattlePartyID[gBankInMenu];
u16 partyId = gBattlerPartyIndexes[gBattlerInMenuId];
if (ExecuteTableBasedItemEffect_(&gPlayerParty[partyId], gSpecialVar_ItemId, partyId, 0) != FALSE)
{
-1
View File
@@ -19,7 +19,6 @@
#include "task.h"
#include "scanline_effect.h"
#include "menu.h"
#include "new_menu_helpers.h"
#include "text.h"
#include "strings.h"
#include "constants/songs.h"
+2414
View File
File diff suppressed because it is too large Load Diff
+6 -7
View File
@@ -17,7 +17,6 @@
#include "window.h"
#include "gpu_regs.h"
#include "text_window.h"
#include "new_menu_helpers.h"
#include "decompress.h"
// this file's functions
@@ -291,13 +290,13 @@ static void CB2_MysteryEventMenu(void)
static void PrintMysteryMenuText(u8 windowId, const u8 *text, u8 x, u8 y, s32 speed)
{
struct TextColor textColor;
u8 textColor[3];
u8 letterSpacing = 0;
u8 lineSpacing = 1;
textColor.fgColor = 1;
textColor.bgColor = 2;
textColor.shadowColor = 3;
textColor[0] = 1;
textColor[1] = 2;
textColor[2] = 3;
FillWindowPixelBuffer(windowId, (textColor.fgColor) | (textColor.fgColor << 4));
AddTextPrinterParameterized2(windowId, 1, x, y, letterSpacing, lineSpacing, &textColor, speed, text);
FillWindowPixelBuffer(windowId, (textColor[0]) | (textColor[0] << 4));
AddTextPrinterParameterized2(windowId, 1, x, y, letterSpacing, lineSpacing, textColor, speed, text);
}
+16 -18
View File
@@ -5,7 +5,6 @@
#include "task.h"
#include "sprite.h"
#include "string_util.h"
#include "new_menu_helpers.h"
#include "window.h"
#include "bg.h"
#include "gpu_regs.h"
@@ -530,7 +529,7 @@ static void DisplaySentToPCMessage(void)
stringToDisplay++;
StringExpandPlaceholders(gStringVar4, gUnknown_0858BDB8[stringToDisplay]);
sub_81973C4(0, 0);
NewMenuHelpers_DrawDialogueFrame(0, 0);
gTextFlags.flag_0 = TRUE;
AddTextPrinterParameterized(0, 1, gStringVar4, GetPlayerTextSpeed(), 0, 2, 1, 3);
CopyWindowToVram(0, 3);
@@ -1496,7 +1495,7 @@ static void TaskDummy3(void)
}
static const struct TextColor sGenderColors[2] =
static const u8 sGenderColors[2][3] =
{
{0, 9, 8},
{0, 5, 4}
@@ -1516,7 +1515,7 @@ static void sub_80E49BC(void)
StringCopy(genderSymbol, gText_FemaleSymbol);
isFemale = TRUE;
}
box_print(gNamingScreenData->windows[2], 1, 0x68, 1, &sGenderColors[isFemale], -1, genderSymbol);
box_print(gNamingScreenData->windows[2], 1, 0x68, 1, sGenderColors[isFemale], -1, genderSymbol);
}
}
@@ -1661,19 +1660,18 @@ static void sub_80E4D10(void)
PutWindowTilemap(gNamingScreenData->windows[2]);
}
static const struct AlignedTextColor sUnkColor1 =
struct TextColorThing // needed because of alignment... it's so stupid
{
13, 1, 2
u8 colors[3][4];
};
static const struct AlignedTextColor sUnkColor2 =
static const struct TextColorThing sUnkColorStruct =
{
14, 1, 2
};
static const struct AlignedTextColor sUnkColor3 =
{
15, 1, 2
{
{13, 1, 2},
{14, 1, 2},
{15, 1, 2}
}
};
static const u8 sFillValues[3] =
@@ -1681,11 +1679,11 @@ static const u8 sFillValues[3] =
0xEE, 0xDD, 0xFF
};
static const struct AlignedTextColor *const sUnkColors[3] =
static const u8 *const sUnkColors[3] =
{
&sUnkColor2,
&sUnkColor1,
&sUnkColor3
sUnkColorStruct.colors[1],
sUnkColorStruct.colors[0],
sUnkColorStruct.colors[2]
};
static void sub_80E4DE4(u8 window, u8 a1)
@@ -1738,7 +1736,7 @@ static void sub_80E4E5C(void)
static void sub_80E4EF0(void)
{
const struct TextColor color[] = { 15, 1, 2 };
const u8 color[3] = { 15, 1, 2 };
FillWindowPixelBuffer(gNamingScreenData->windows[4], 0xFF);
box_print(gNamingScreenData->windows[4], 0, 2, 1, color, 0, gText_MoveOkBack);
+37 -232
View File
@@ -840,289 +840,94 @@ void BlendPalettesUnfaded(u32 selectedPalettes, u8 coeff, u16 color)
void TintPalette_GrayScale(u16 *palette, u16 count)
{
int r;
int g;
int b;
s32 r, g, b, i;
u32 gray;
int i;
for (i = 0; i < count; i++)
{
r = *palette & 0x1F;
g = (*palette >> 5) & 0x1F;
r = (*palette >> 0) & 0x1F;
g = (*palette >> 5) & 0x1F;
b = (*palette >> 10) & 0x1F;
r = r * Q_8_8(0.2969);
r += g * Q_8_8(0.5899);
r += b * Q_8_8(0.1133);
gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8;
gray = r >> 8;
*palette++ = gray << 10 | gray << 5 | gray;
*palette++ = (gray << 10) | (gray << 5) | (gray << 0);
}
}
void TintPalette_GrayScale2(u16 *palette, u16 count)
{
int r;
int g;
int b;
s32 r, g, b, i;
u32 gray;
int i;
for (i = 0; i < count; i++)
{
r = *palette & 0x1F;
g = (*palette >> 5) & 0x1F;
r = (*palette >> 0) & 0x1F;
g = (*palette >> 5) & 0x1F;
b = (*palette >> 10) & 0x1F;
r = r * Q_8_8(0.2969);
r += g * Q_8_8(0.5899);
r += b * Q_8_8(0.1133);
gray = r >> 8;
gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8;
if (gray > 0x1F)
gray = 0x1F;
gray = sRoundedDownGrayscaleMap[gray];
*palette++ = gray << 10 | gray << 5 | gray;
*palette++ = (gray << 10) | (gray << 5) | (gray << 0);
}
}
#ifdef NONMATCHING
void TintPalette_SepiaTone(u16 *palette, u16 count)
{
int red;
int green;
int blue;
s32 r, g, b, i;
u32 gray;
u32 sepia;
s8 r2;
s8 g2;
s8 b2;
int i;
for (i = 0; i < count; i++)
{
r = *palette & 0x1F;
g = (*palette >> 5) & 0x1F;
r = (*palette >> 0) & 0x1F;
g = (*palette >> 5) & 0x1F;
b = (*palette >> 10) & 0x1F;
r *= 0x4C;
r += g * 0x97;
r += b * 0x1D;
gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8;
gray = (s32)(r >> 8);
r = (u16)((Q_8_8(1.2) * gray)) >> 8;
g = (u16)((Q_8_8(1.0) * gray)) >> 8;
b = (u16)((Q_8_8(0.94) * gray)) >> 8;
sepia = (gray * 0x133);
if (r > 31)
r = 31;
r2 = (u16)sepia >> 8;
g2 = gray;
b2 = (gray * 15);
if (r2 > 0x1F)
r2 = 0x1F;
*palette++ = b2 << 10 | g2 << 5 | r2;
*palette++ = (b << 10) | (g << 5) | (r << 0);
}
}
#else
ASM_DIRECT
void TintPalette_SepiaTone(u16 *palette, u16 count)
{
asm("push {r4-r7,lr}\n\
add r5, r0, #0\n\
lsl r1, #16\n\
lsr r1, #16\n\
cmp r1, #0\n\
beq _080A2BA2\n\
mov r7, #0x1F\n\
add r6, r1, #0\n\
_080A2B50:\n\
ldrh r0, [r5]\n\
mov r1, #0x1F\n\
and r1, r0\n\
lsl r0, #16\n\
lsr r2, r0, #21\n\
and r2, r7\n\
lsr r3, r0, #26\n\
and r3, r7\n\
mov r0, #0x4C\n\
mul r1, r0\n\
mov r0, #0x97\n\
mul r0, r2\n\
add r1, r0\n\
lsl r0, r3, #3\n\
sub r0, r3\n\
lsl r0, #2\n\
add r0, r3\n\
add r1, r0\n\
asr r1, #8\n\
ldr r0, =0x00000133\n\
mul r0, r1\n\
lsl r0, #16\n\
lsr r2, r0, #24\n\
lsl r0, r1, #24\n\
lsr r4, r0, #24\n\
lsl r0, r1, #4\n\
sub r0, r1\n\
lsl r0, #20\n\
lsr r3, r0, #24\n\
cmp r2, #0x1F\n\
ble _080A2B90\n\
mov r2, #0x1F\n\
_080A2B90:\n\
lsl r0, r3, #10\n\
lsl r1, r4, #5\n\
orr r0, r1\n\
orr r0, r2\n\
strh r0, [r5]\n\
add r5, #0x2\n\
sub r6, #0x1\n\
cmp r6, #0\n\
bne _080A2B50\n\
_080A2BA2:\n\
pop {r4-r7}\n\
pop {r0}\n\
bx r0\n\
.pool");
}
#endif // NONMATCHING
#ifdef NONMATCHING
void TintPalette_CustomTone(u16 *palette, u16 count, u16 a3, u16 a4, u16 a5)
void TintPalette_CustomTone(u16 *palette, u16 count, u16 rTone, u16 gTone, u16 bTone)
{
s32 r;
s32 g;
s32 b;
s32 gray;
u8 r2;
u8 g2;
u8 b2;
s32 r, g, b, i;
u32 gray;
int i;
for (i = 0; i < count; i++)
{
r = *palette & 0x1F;
g = (*palette >> 5) & 0x1F;
r = (*palette >> 0) & 0x1F;
g = (*palette >> 5) & 0x1F;
b = (*palette >> 10) & 0x1F;
r *= 0x4C;
r += g * 0x97;
r += b * 0x1D;
gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8;
gray = r >> 8;
r = (u16)((rTone * gray)) >> 8;
g = (u16)((gTone * gray)) >> 8;
b = (u16)((bTone * gray)) >> 8;
r2 = (u16)(gray * a3) >> 8;
if (r > 31)
r = 31;
if (g > 31)
g = 31;
if (b > 31)
b = 31;
g2 = (u16)(gray * a4) >> 8;
b2 = (u16)(gray * a5) >> 8;
if (r2 > 0x1F)
r2 = 0x1F;
if (g2 > 0x1F)
g2 = 0x1F;
if (b2 > 0x1F)
b2 = 0x1F;
*palette++ = b2 << 10 | g2 << 5 | r2;
*palette++ = (b << 10) | (g << 5) | (r << 0);
}
return;
}
#else
ASM_DIRECT
void TintPalette_CustomTone(u16 *palette, u16 count, u16 a3, u16 a4, u16 a5)
{
asm("push {r4-r7,lr}\n\
mov r7, r9\n\
mov r6, r8\n\
push {r6,r7}\n\
add r5, r0, #0\n\
ldr r0, [sp, #0x1C]\n\
lsl r1, #16\n\
lsr r1, #16\n\
lsl r2, #16\n\
lsr r2, #16\n\
mov r9, r2\n\
lsl r3, #16\n\
lsr r3, #16\n\
mov r8, r3\n\
lsl r0, #16\n\
lsr r0, #16\n\
mov r12, r0\n\
cmp r1, #0\n\
beq _080A2C38\n\
mov r7, #0x1F\n\
add r6, r1, #0\n\
_080A2BD6:\n\
ldrh r0, [r5]\n\
mov r1, #0x1F\n\
and r1, r0\n\
lsl r0, #16\n\
lsr r2, r0, #21\n\
and r2, r7\n\
lsr r3, r0, #26\n\
and r3, r7\n\
mov r0, #0x4C\n\
mul r1, r0\n\
mov r0, #0x97\n\
mul r0, r2\n\
add r1, r0\n\
lsl r0, r3, #3\n\
sub r0, r3\n\
lsl r0, #2\n\
add r0, r3\n\
add r1, r0\n\
asr r1, #8\n\
mov r0, r9\n\
mul r0, r1\n\
lsl r0, #16\n\
lsr r4, r0, #24\n\
mov r0, r8\n\
mul r0, r1\n\
lsl r0, #16\n\
lsr r2, r0, #24\n\
mov r0, r12\n\
mul r0, r1\n\
lsl r0, #16\n\
lsr r3, r0, #24\n\
cmp r4, #0x1F\n\
ble _080A2C1A\n\
mov r4, #0x1F\n\
_080A2C1A:\n\
cmp r2, #0x1F\n\
ble _080A2C20\n\
mov r2, #0x1F\n\
_080A2C20:\n\
cmp r3, #0x1F\n\
ble _080A2C26\n\
mov r3, #0x1F\n\
_080A2C26:\n\
lsl r0, r3, #10\n\
lsl r1, r2, #5\n\
orr r0, r1\n\
orr r0, r4\n\
strh r0, [r5]\n\
add r5, #0x2\n\
sub r6, #0x1\n\
cmp r6, #0\n\
bne _080A2BD6\n\
_080A2C38:\n\
pop {r3,r4}\n\
mov r8, r3\n\
mov r9, r4\n\
pop {r4-r7}\n\
pop {r0}\n\
bx r0");
}
#endif
void sub_80A2C44(u32 a1, s8 a2, u8 a3, u8 a4, u16 a5, u8 a6, u8 a7)
{
+54 -60
View File
@@ -15,12 +15,6 @@
#include "util.h"
#include "graphics.h"
extern bool8 gDoingBattleAnim;
extern u8 gActiveBank;
extern u8 gBankTarget;
extern u16 gBattlePartyID[];
extern u8 gBankSpriteIds[];
extern u8 gHealthBoxesIds[];
extern struct MusicPlayerInfo gMPlayInfo_BGM;
// this file's functions
@@ -334,12 +328,12 @@ u8 DoPokeballSendOutAnimation(s16 pan, u8 kindOfThrow)
u8 taskId;
gDoingBattleAnim = TRUE;
gBattleSpritesDataPtr->healthBoxesData[gActiveBank].ballAnimActive = 1;
gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].ballAnimActive = 1;
taskId = CreateTask(Task_DoPokeballSendOutAnim, 5);
gTasks[taskId].tPan = pan;
gTasks[taskId].tThrowId = kindOfThrow;
gTasks[taskId].tBank = gActiveBank;
gTasks[taskId].tBank = gActiveBattler;
return 0;
}
@@ -363,10 +357,10 @@ static void Task_DoPokeballSendOutAnim(u8 taskId)
throwCaseId = gTasks[taskId].tThrowId;
bank = gTasks[taskId].tBank;
if (GetBankSide(bank) != SIDE_PLAYER)
itemId = GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_POKEBALL);
if (GetBattlerSide(bank) != B_SIDE_PLAYER)
itemId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[bank]], MON_DATA_POKEBALL);
else
itemId = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_POKEBALL);
itemId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[bank]], MON_DATA_POKEBALL);
ballId = ItemIdToBallId(itemId);
LoadBallGfx(ballId);
@@ -378,25 +372,25 @@ static void Task_DoPokeballSendOutAnim(u8 taskId)
switch (throwCaseId)
{
case POKEBALL_PLAYER_SENDOUT:
gBankTarget = bank;
gBattlerTarget = bank;
gSprites[ballSpriteId].pos1.x = 24;
gSprites[ballSpriteId].pos1.y = 68;
gSprites[ballSpriteId].callback = SpriteCB_PlayerMonSendOut_1;
break;
case POKEBALL_OPPONENT_SENDOUT:
gSprites[ballSpriteId].pos1.x = GetBankPosition(bank, BANK_X_POS);
gSprites[ballSpriteId].pos1.y = GetBankPosition(bank, BANK_Y_POS) + 24;
gBankTarget = bank;
gSprites[ballSpriteId].pos1.x = GetBattlerSpriteCoord(bank, BANK_X_POS);
gSprites[ballSpriteId].pos1.y = GetBattlerSpriteCoord(bank, BANK_Y_POS) + 24;
gBattlerTarget = bank;
gSprites[ballSpriteId].data[0] = 0;
gSprites[ballSpriteId].callback = SpriteCB_OpponentMonSendOut;
break;
default:
gBankTarget = GetBankByIdentity(IDENTITY_OPPONENT_MON1);
gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
notSendOut = TRUE;
break;
}
gSprites[ballSpriteId].sBank = gBankTarget;
gSprites[ballSpriteId].sBank = gBattlerTarget;
if (!notSendOut)
{
DestroyTask(taskId);
@@ -405,12 +399,12 @@ static void Task_DoPokeballSendOutAnim(u8 taskId)
// this will perform an unused ball throw animation
gSprites[ballSpriteId].data[0] = 0x22;
gSprites[ballSpriteId].data[2] = GetBankPosition(gBankTarget, BANK_X_POS);
gSprites[ballSpriteId].data[4] = GetBankPosition(gBankTarget, BANK_Y_POS) - 16;
gSprites[ballSpriteId].data[2] = GetBattlerSpriteCoord(gBattlerTarget, BANK_X_POS);
gSprites[ballSpriteId].data[4] = GetBattlerSpriteCoord(gBattlerTarget, BANK_Y_POS) - 16;
gSprites[ballSpriteId].data[5] = -40;
sub_80A68D4(&gSprites[ballSpriteId]);
gSprites[ballSpriteId].oam.affineParam = taskId;
gTasks[taskId].tOpponentBank = gBankTarget;
gTasks[taskId].tOpponentBank = gBattlerTarget;
gTasks[taskId].func = TaskDummy;
PlaySE(SE_NAGERU);
}
@@ -458,9 +452,9 @@ static void sub_80756E0(struct Sprite *sprite)
{
sprite->data[5] = 0;
sprite->callback = sub_807574C;
StartSpriteAffineAnim(&gSprites[gBankSpriteIds[sprite->sBank]], 2);
AnimateSprite(&gSprites[gBankSpriteIds[sprite->sBank]]);
gSprites[gBankSpriteIds[sprite->sBank]].data[1] = 0;
StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[sprite->sBank]], 2);
AnimateSprite(&gSprites[gBattlerSpriteIds[sprite->sBank]]);
gSprites[gBattlerSpriteIds[sprite->sBank]].data[1] = 0;
}
}
@@ -469,17 +463,17 @@ static void sub_807574C(struct Sprite *sprite)
sprite->data[5]++;
if (sprite->data[5] == 11)
PlaySE(SE_SUIKOMU);
if (gSprites[gBankSpriteIds[sprite->sBank]].affineAnimEnded)
if (gSprites[gBattlerSpriteIds[sprite->sBank]].affineAnimEnded)
{
StartSpriteAnim(sprite, 2);
gSprites[gBankSpriteIds[sprite->sBank]].invisible = TRUE;
gSprites[gBattlerSpriteIds[sprite->sBank]].invisible = TRUE;
sprite->data[5] = 0;
sprite->callback = sub_80757E4;
}
else
{
gSprites[gBankSpriteIds[sprite->sBank]].data[1] += 0x60;
gSprites[gBankSpriteIds[sprite->sBank]].pos2.y = -gSprites[gBankSpriteIds[sprite->sBank]].data[1] >> 8;
gSprites[gBattlerSpriteIds[sprite->sBank]].data[1] += 0x60;
gSprites[gBattlerSpriteIds[sprite->sBank]].pos2.y = -gSprites[gBattlerSpriteIds[sprite->sBank]].data[1] >> 8;
}
}
@@ -755,19 +749,19 @@ static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite)
u16 wantedCryCase;
u8 taskId;
if (GetBankSide(bank) != SIDE_PLAYER)
if (GetBattlerSide(bank) != B_SIDE_PLAYER)
{
mon = &gEnemyParty[gBattlePartyID[bank]];
mon = &gEnemyParty[gBattlerPartyIndexes[bank]];
pan = 25;
}
else
{
mon = &gPlayerParty[gBattlePartyID[bank]];
mon = &gPlayerParty[gBattlerPartyIndexes[bank]];
pan = -25;
}
species = GetMonData(mon, MON_DATA_SPECIES);
if ((bank == GetBankByIdentity(IDENTITY_PLAYER_MON1) || bank == GetBankByIdentity(IDENTITY_OPPONENT_MON1))
if ((bank == GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) || bank == GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT))
&& IsDoubleBattle() && gBattleSpritesDataPtr->animationData->field_9_x1)
{
if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_LINK)
@@ -783,7 +777,7 @@ static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite)
if (!IsDoubleBattle() || !gBattleSpritesDataPtr->animationData->field_9_x1)
wantedCryCase = 0;
else if (bank == GetBankByIdentity(IDENTITY_PLAYER_MON1) || bank == GetBankByIdentity(IDENTITY_OPPONENT_MON1))
else if (bank == GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) || bank == GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT))
wantedCryCase = 1;
else
wantedCryCase = 2;
@@ -795,21 +789,21 @@ static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite)
gTasks[taskId].tCryTaskPan = pan;
gTasks[taskId].tCryTaskWantedCry = wantedCryCase;
gTasks[taskId].tCryTaskBank = bank;
gTasks[taskId].tCryTaskMonSpriteId = gBankSpriteIds[sprite->sBank];
gTasks[taskId].tCryTaskMonSpriteId = gBattlerSpriteIds[sprite->sBank];
gTasks[taskId].tCryTaskMonPtr1 = (u32)(mon) >> 0x10;
gTasks[taskId].tCryTaskMonPtr2 = (u32)(mon);
gTasks[taskId].tCryTaskState = 0;
}
StartSpriteAffineAnim(&gSprites[gBankSpriteIds[sprite->sBank]], 1);
StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[sprite->sBank]], 1);
if (GetBankSide(sprite->sBank) == SIDE_OPPONENT)
gSprites[gBankSpriteIds[sprite->sBank]].callback = sub_8039B58;
if (GetBattlerSide(sprite->sBank) == B_SIDE_OPPONENT)
gSprites[gBattlerSpriteIds[sprite->sBank]].callback = sub_8039B58;
else
gSprites[gBankSpriteIds[sprite->sBank]].callback = sub_8039E44;
gSprites[gBattlerSpriteIds[sprite->sBank]].callback = sub_8039E44;
AnimateSprite(&gSprites[gBankSpriteIds[sprite->sBank]]);
gSprites[gBankSpriteIds[sprite->sBank]].data[1] = 0x1000;
AnimateSprite(&gSprites[gBattlerSpriteIds[sprite->sBank]]);
gSprites[gBattlerSpriteIds[sprite->sBank]].data[1] = 0x1000;
}
#undef tCryTaskSpecies
@@ -836,35 +830,35 @@ static void HandleBallAnimEnd(struct Sprite *sprite)
bool8 affineAnimEnded = FALSE;
u8 bank = sprite->sBank;
gSprites[gBankSpriteIds[bank]].invisible = FALSE;
gSprites[gBattlerSpriteIds[bank]].invisible = FALSE;
if (sprite->animEnded)
sprite->invisible = TRUE;
if (gSprites[gBankSpriteIds[bank]].affineAnimEnded)
if (gSprites[gBattlerSpriteIds[bank]].affineAnimEnded)
{
StartSpriteAffineAnim(&gSprites[gBankSpriteIds[bank]], 0);
StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[bank]], 0);
affineAnimEnded = TRUE;
}
else
{
gSprites[gBankSpriteIds[bank]].data[1] -= 288;
gSprites[gBankSpriteIds[bank]].pos2.y = gSprites[gBankSpriteIds[bank]].data[1] >> 8;
gSprites[gBattlerSpriteIds[bank]].data[1] -= 288;
gSprites[gBattlerSpriteIds[bank]].pos2.y = gSprites[gBattlerSpriteIds[bank]].data[1] >> 8;
}
if (sprite->animEnded && affineAnimEnded)
{
s32 i, doneBanks;
gSprites[gBankSpriteIds[bank]].pos2.y = 0;
gSprites[gBattlerSpriteIds[bank]].pos2.y = 0;
gDoingBattleAnim = FALSE;
gBattleSpritesDataPtr->healthBoxesData[bank].ballAnimActive = 0;
FreeSpriteOamMatrix(sprite);
DestroySprite(sprite);
for (doneBanks = 0, i = 0; i < BATTLE_BANKS_COUNT; i++)
for (doneBanks = 0, i = 0; i < MAX_BATTLERS_COUNT; i++)
{
if (gBattleSpritesDataPtr->healthBoxesData[i].ballAnimActive == 0)
doneBanks++;
}
if (doneBanks == BATTLE_BANKS_COUNT)
if (doneBanks == MAX_BATTLERS_COUNT)
{
for (i = 0; i < POKEBALL_COUNT; i++)
FreeBallGfx(i);
@@ -889,8 +883,8 @@ static void sub_80760F8(struct Sprite *sprite)
}
else if (sprite->data[4] == 315)
{
FreeOamMatrix(gSprites[gBankSpriteIds[sprite->sBank]].oam.matrixNum);
DestroySprite(&gSprites[gBankSpriteIds[sprite->sBank]]);
FreeOamMatrix(gSprites[gBattlerSpriteIds[sprite->sBank]].oam.matrixNum);
DestroySprite(&gSprites[gBattlerSpriteIds[sprite->sBank]]);
DestroySpriteAndFreeResources(sprite);
if (gMain.inBattle)
gBattleSpritesDataPtr->healthBoxesData[bank].ballAnimActive = 0;
@@ -900,8 +894,8 @@ static void sub_80760F8(struct Sprite *sprite)
static void SpriteCB_PlayerMonSendOut_1(struct Sprite *sprite)
{
sprite->data[0] = 25;
sprite->data[2] = GetBankPosition(sprite->sBank, 2);
sprite->data[4] = GetBankPosition(sprite->sBank, 3) + 24;
sprite->data[2] = GetBattlerSpriteCoord(sprite->sBank, 2);
sprite->data[4] = GetBattlerSpriteCoord(sprite->sBank, 3) + 24;
sprite->data[5] = -30;
sprite->oam.affineParam = sprite->sBank;
sub_80A68D4(sprite);
@@ -956,7 +950,7 @@ static void SpriteCB_PlayerMonSendOut_2(struct Sprite *sprite)
sprite->data[0] = 0;
if (IsDoubleBattle() && gBattleSpritesDataPtr->animationData->field_9_x1
&& sprite->sBank == GetBankByIdentity(IDENTITY_PLAYER_MON2))
&& sprite->sBank == GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT))
sprite->callback = SpriteCB_ReleaseMon2FromBall;
else
sprite->callback = SpriteCB_ReleaseMonFromBall;
@@ -982,7 +976,7 @@ static void SpriteCB_OpponentMonSendOut(struct Sprite *sprite)
{
sprite->data[0] = 0;
if (IsDoubleBattle() && gBattleSpritesDataPtr->animationData->field_9_x1
&& sprite->sBank == GetBankByIdentity(IDENTITY_OPPONENT_MON2))
&& sprite->sBank == GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT))
sprite->callback = SpriteCB_ReleaseMon2FromBall;
else
sprite->callback = SpriteCB_ReleaseMonFromBall;
@@ -1183,14 +1177,14 @@ static void DestroySpriteAndFreeResources_(struct Sprite *sprite)
void sub_8076918(u8 bank)
{
struct Sprite *healthboxSprite = &gSprites[gHealthBoxesIds[bank]];
struct Sprite *healthboxSprite = &gSprites[gHealthboxSpriteIds[bank]];
healthboxSprite->data[0] = 5;
healthboxSprite->data[1] = 0;
healthboxSprite->pos2.x = 0x73;
healthboxSprite->pos2.y = 0;
healthboxSprite->callback = sub_80769CC;
if (GetBankSide(bank) != SIDE_PLAYER)
if (GetBattlerSide(bank) != B_SIDE_PLAYER)
{
healthboxSprite->data[0] = -healthboxSprite->data[0];
healthboxSprite->data[1] = -healthboxSprite->data[1];
@@ -1198,7 +1192,7 @@ void sub_8076918(u8 bank)
healthboxSprite->pos2.y = -healthboxSprite->pos2.y;
}
gSprites[healthboxSprite->data[5]].callback(&gSprites[healthboxSprite->data[5]]);
if (GetBankIdentity(bank) == IDENTITY_PLAYER_MON2)
if (GetBattlerPosition(bank) == B_POSITION_PLAYER_RIGHT)
healthboxSprite->callback = sub_80769A8;
}
@@ -1226,7 +1220,7 @@ void DoHitAnimHealthboxEffect(u8 bank)
spriteId = CreateInvisibleSpriteWithCallback(SpriteCB_HitAnimHealthoxEffect);
gSprites[spriteId].data[0] = 1;
gSprites[spriteId].data[1] = gHealthBoxesIds[bank];
gSprites[spriteId].data[1] = gHealthboxSpriteIds[bank];
gSprites[spriteId].callback = SpriteCB_HitAnimHealthoxEffect;
}
@@ -1275,8 +1269,8 @@ void FreeBallGfx(u8 ballId)
static u16 GetBankPokeballItemId(u8 bank)
{
if (GetBankSide(bank) == SIDE_PLAYER)
return GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_POKEBALL);
if (GetBattlerSide(bank) == B_SIDE_PLAYER)
return GetMonData(&gPlayerParty[gBattlerPartyIndexes[bank]], MON_DATA_POKEBALL);
else
return GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_POKEBALL);
return GetMonData(&gEnemyParty[gBattlerPartyIndexes[bank]], MON_DATA_POKEBALL);
}
+2 -3
View File
@@ -6,7 +6,6 @@
#include "menu.h"
#include "task.h"
#include "menu_helpers.h"
#include "new_menu_helpers.h"
#include "pokemon.h"
#include "graphics.h"
#include "malloc.h"
@@ -284,7 +283,7 @@ static const struct SpriteTemplate sSpriteTemplate_PokeblockCase =
SpriteCallbackDummy
};
static const struct TextColor sTextColorInPokeblockMenu = {0, 2, 3};
static const u8 sTextColorInPokeblockMenu[3] = {0, 2, 3};
static const struct Pokeblock sFavoritePokeblocksTable[] =
{
@@ -583,7 +582,7 @@ static void HandleInitWindows(void)
static void PrintOnPokeblockWindow(u8 windowId, const u8 *string, s32 x)
{
AddTextPrinterParameterized2(windowId, 1, x, 1, 0, 0, &sTextColorInPokeblockMenu, 0, string);
AddTextPrinterParameterized2(windowId, 1, x, 1, 0, 0, sTextColorInPokeblockMenu, 0, string);
}
static void PutPokeblockInfoText(void)
-1
View File
@@ -16,7 +16,6 @@
#include "event_data.h"
#include "strings.h"
#include "string_util.h"
#include "new_menu_helpers.h"
#include "party_menu.h"
#include "m4a.h"
#include "sound.h"
+68 -2
View File
@@ -2,7 +2,11 @@
#include "pokemon.h"
#include "random.h"
#include "main.h"
#include "constants/species.h"
#include "constants/abilities.h"
#include "constants/items.h"
#include "constants/trainers.h"
#include "constants/moves.h"
#include "string_util.h"
#include "text.h"
@@ -14,6 +18,68 @@
extern u8 sav1_map_get_name(void);
// EWRAM vars
EWRAM_DATA u8 sLearningMoveTableID = 0;
EWRAM_DATA u8 gPlayerPartyCount = 0;
EWRAM_DATA u8 gEnemyPartyCount = 0;
EWRAM_DATA struct Pokemon gPlayerParty[PARTY_SIZE] = {0};
EWRAM_DATA struct Pokemon gEnemyParty[PARTY_SIZE] = {0};
// const rom data
const u16 gSpeciesToHoennPokedexNum[] = {203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 156, 157, 112, 113, 227, 228, 229, 230, 231, 232, 233, 234, 153, 154, 138, 139, 63, 64, 88, 89, 90, 235, 236, 237, 238, 239, 240, 241, 242, 158, 159, 243, 244, 245, 246, 247, 248, 249, 39, 40, 41, 73, 74, 75, 250, 251, 252, 66, 67, 57, 58, 59, 253, 254, 255, 256, 82, 83, 257, 92, 93, 258, 259, 106, 107, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 84, 85, 270, 271, 272, 273, 274, 275, 276, 108, 109, 169, 170, 277, 278, 279, 184, 185, 50, 51, 143, 144, 280, 281, 282, 283, 284, 167, 285, 52, 53, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 65, 181, 182, 155, 324, 137, 325, 326, 162, 163, 327, 328, 329, 91, 55, 56, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 161, 164, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 168, 357, 358, 359, 103, 104, 360, 361, 180, 362, 363, 364, 365, 115, 366, 367, 186, 165, 166, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 42, 43, 44, 25, 26, 34, 35, 114, 27, 28, 32, 33, 99, 100, 61, 62, 145, 131, 132, 60, 105, 68, 127, 128, 183, 129, 130, 140, 141, 97, 98, 116, 117, 118, 48, 49, 78, 79, 101, 102, 173, 174, 175, 119, 120, 171, 172, 125, 126, 54, 110, 111, 80, 81, 69, 76, 77, 121, 122, 160, 148, 149, 94, 36, 37, 38, 95, 96, 150, 45, 46, 47, 176, 177, 178, 152, 146, 147, 124, 123, 179, 70, 71, 72, 142, 86, 87, 133, 134, 135, 136, 29, 30, 31, 187, 188, 189, 190, 191, 192, 193, 194, 195, 198, 199, 200, 196, 197, 201, 202, 151};
const u16 gSpeciesToNationalPokedexNum[] = {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, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 290, 291, 292, 276, 277, 285, 286, 327, 278, 279, 283, 284, 320, 321, 300, 301, 352, 343, 344, 299, 324, 302, 339, 340, 370, 341, 342, 349, 350, 318, 319, 328, 329, 330, 296, 297, 309, 310, 322, 323, 363, 364, 365, 331, 332, 361, 362, 337, 338, 298, 325, 326, 311, 312, 303, 307, 308, 333, 334, 360, 355, 356, 315, 287, 288, 289, 316, 317, 357, 293, 294, 295, 366, 367, 368, 359, 353, 354, 336, 335, 369, 304, 305, 306, 351, 313, 314, 345, 346, 347, 348, 280, 281, 282, 371, 372, 373, 374, 375, 376, 377, 378, 379, 382, 383, 384, 380, 381, 385, 386, 358};
const u16 gHoennToNationalOrder[] = {252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 63, 64, 65, 290, 291, 292, 293, 294, 295, 296, 297, 118, 119, 129, 130, 298, 183, 184, 74, 75, 76, 299, 300, 301, 41, 42, 169, 72, 73, 302, 303, 304, 305, 306, 66, 67, 68, 307, 308, 309, 310, 311, 312, 81, 82, 100, 101, 313, 314, 43, 44, 45, 182, 84, 85, 315, 316, 317, 318, 319, 320, 321, 322, 323, 218, 219, 324, 88, 89, 109, 110, 325, 326, 27, 28, 327, 227, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 174, 39, 40, 349, 350, 351, 120, 121, 352, 353, 354, 355, 356, 357, 358, 359, 37, 38, 172, 25, 26, 54, 55, 360, 202, 177, 178, 203, 231, 232, 127, 214, 111, 112, 361, 362, 363, 364, 365, 366, 367, 368, 369, 222, 170, 171, 370, 116, 117, 230, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 29, 30, 31, 32, 33, 34, 35, 36, 46, 47, 48, 49, 50, 51, 52, 53, 56, 57, 58, 59, 60, 61, 62, 69, 70, 71, 77, 78, 79, 80, 83, 86, 87, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 102, 103, 104, 105, 106, 107, 108, 113, 114, 115, 122, 123, 124, 125, 126, 128, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 173, 175, 176, 179, 180, 181, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, 220, 221, 223, 224, 225, 226, 228, 229, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411};
const struct SpindaSpot gSpindaSpotGraphics[] =
{
{16, 7, INCBIN_U16("graphics/spinda_spots/spot_0.bin")},
{40, 8, INCBIN_U16("graphics/spinda_spots/spot_1.bin")},
{22, 25, INCBIN_U16("graphics/spinda_spots/spot_2.bin")},
{34, 26, INCBIN_U16("graphics/spinda_spots/spot_3.bin")}
};
#include "data/pokemon/item_effects.h"
const s8 gNatureStatTable[][5] =
{
// Atk Def Spd Sp.Atk Sp.Def
{ 0, 0, 0, 0, 0}, // Hardy
{ +1, -1, 0, 0, 0}, // Lonely
{ +1, 0, -1, 0, 0}, // Brave
{ +1, 0, 0, -1, 0}, // Adamant
{ +1, 0, 0, 0, -1}, // Naughty
{ -1, +1, 0, 0, 0}, // Bold
{ 0, 0, 0, 0, 0}, // Docile
{ 0, +1, -1, 0, 0}, // Relaxed
{ 0, +1, 0, -1, 0}, // Impish
{ 0, +1, 0, 0, -1}, // Lax
{ -1, 0, +1, 0, 0}, // Timid
{ 0, -1, +1, 0, 0}, // Hasty
{ 0, 0, 0, 0, 0}, // Serious
{ 0, 0, +1, -1, 0}, // Jolly
{ 0, 0, +1, 0, -1}, // Naive
{ -1, 0, 0, +1, 0}, // Modest
{ 0, -1, 0, +1, 0}, // Mild
{ 0, 0, -1, +1, 0}, // Quiet
{ 0, 0, 0, 0, 0}, // Bashful
{ 0, 0, 0, +1, -1}, // Rash
{ -1, 0, 0, 0, +1}, // Calm
{ 0, -1, 0, 0, +1}, // Gentle
{ 0, 0, -1, 0, +1}, // Sassy
{ 0, 0, 0, -1, +1}, // Careful
{ 0, 0, 0, 0, 0}, // Quirky
};
#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"
// code
void ZeroBoxMonData(struct BoxPokemon *boxMon)
{
u8 *raw = (u8 *)boxMon;
@@ -43,14 +109,14 @@ void ZeroMonData(struct Pokemon *mon)
void ZeroPlayerPartyMons(void)
{
s32 i;
for (i = 0; i < 6; i++)
for (i = 0; i < PARTY_SIZE; i++)
ZeroMonData(&gPlayerParty[i]);
}
void ZeroEnemyPartyMons(void)
{
s32 i;
for (i = 0; i < 6; i++)
for (i = 0; i < PARTY_SIZE; i++)
ZeroMonData(&gEnemyParty[i]);
}
+31 -31
View File
@@ -14,10 +14,10 @@ struct Unknown_020249B4
struct SpriteTemplate* templates;
};
extern u8 gAbsentBankFlags;
extern u8 gActiveBank;
extern u8 gBankAttacker;
extern u8 gBankTarget;
extern u8 gAbsentBattlerFlags;
extern u8 gActiveBattler;
extern u8 gBattlerAttacker;
extern u8 gBattlerTarget;
extern u8 gLastUsedAbility;
extern u16 gTrainerBattleOpponent_A;
extern u32 gBattleTypeFlags;
@@ -34,9 +34,9 @@ extern const union AnimCmd* const * const gUnknown_0830536C[];
extern const u8 gText_BadEgg[];
extern const u8 gText_EggNickname[];
extern u8 GetBankSide(u8 bank);
extern u8 GetBankByIdentity(u8 bank);
extern u8 GetBankIdentity(u8 bank);
extern u8 GetBattlerSide(u8 bank);
extern u8 GetBattlerAtPosition(u8 bank);
extern u8 GetBattlerPosition(u8 bank);
u8 CountAliveMonsInBattle(u8 caseId)
{
@@ -48,21 +48,21 @@ u8 CountAliveMonsInBattle(u8 caseId)
case BATTLE_ALIVE_EXCEPT_ACTIVE:
for (i = 0; i < 4; i++)
{
if (i != gActiveBank && !(gAbsentBankFlags & gBitTable[i]))
if (i != gActiveBattler && !(gAbsentBattlerFlags & gBitTable[i]))
retVal++;
}
break;
case BATTLE_ALIVE_ATK_SIDE:
for (i = 0; i < 4; i++)
{
if (GetBankSide(i) == GetBankSide(gBankAttacker) && !(gAbsentBankFlags & gBitTable[i]))
if (GetBattlerSide(i) == GetBattlerSide(gBattlerAttacker) && !(gAbsentBattlerFlags & gBitTable[i]))
retVal++;
}
break;
case BATTLE_ALIVE_DEF_SIDE:
for (i = 0; i < 4; i++)
{
if (GetBankSide(i) == GetBankSide(gBankTarget) && !(gAbsentBankFlags & gBitTable[i]))
if (GetBattlerSide(i) == GetBattlerSide(gBattlerTarget) && !(gAbsentBattlerFlags & gBitTable[i]))
retVal++;
}
break;
@@ -75,7 +75,7 @@ bool8 ShouldGetStatBadgeBoost(u16 badgeFlag, u8 bank)
{
if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_x2000000 | BATTLE_TYPE_FRONTIER))
return FALSE;
if (GetBankSide(bank) != SIDE_PLAYER)
if (GetBattlerSide(bank) != B_SIDE_PLAYER)
return FALSE;
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gTrainerBattleOpponent_A == SECRET_BASE_OPPONENT)
return FALSE;
@@ -86,11 +86,11 @@ bool8 ShouldGetStatBadgeBoost(u16 badgeFlag, u8 bank)
u8 GetDefaultMoveTarget(u8 bank)
{
u8 status = GetBankIdentity(bank) & 1;
u8 status = GetBattlerPosition(bank) & 1;
status ^= 1;
if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
return GetBankByIdentity(status);
return GetBattlerAtPosition(status);
if (CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_ACTIVE) > 1)
{
u8 val;
@@ -99,14 +99,14 @@ u8 GetDefaultMoveTarget(u8 bank)
val = status ^ 2;
else
val = status;
return GetBankByIdentity(val);
return GetBattlerAtPosition(val);
}
else
{
if ((gAbsentBankFlags & gBitTable[status]))
return GetBankByIdentity(status ^ 2);
if ((gAbsentBattlerFlags & gBitTable[status]))
return GetBattlerAtPosition(status ^ 2);
else
return GetBankByIdentity(status);
return GetBattlerAtPosition(status);
}
}
@@ -332,7 +332,7 @@ u32 GetMonData(struct Pokemon *mon, s32 field, u8* data)
ret = mon->defense;
break;
case MON_DATA_SPEED:
ret = GetDeoxysStat(mon, STAT_SPD);
ret = GetDeoxysStat(mon, STAT_SPEED);
if (!ret)
ret = mon->speed;
break;
@@ -1197,45 +1197,45 @@ void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord)
for (i = 0; i < PARTY_SIZE; i++)
{
if (gBattleResources->secretBase->partySpecies[i])
if (gBattleResources->secretBase->party.species[i])
{
CreateMon(&gEnemyParty[i],
gBattleResources->secretBase->partySpecies[i],
gBattleResources->secretBase->partyLevels[i],
gBattleResources->secretBase->party.species[i],
gBattleResources->secretBase->party.levels[i],
15,
1,
gBattleResources->secretBase->partyPersonality[i],
gBattleResources->secretBase->party.personality[i],
2,
0);
SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleResources->secretBase->partyHeldItems[i]);
SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleResources->secretBase->party.heldItems[i]);
for (j = 0; j < 6; j++)
SetMonData(&gEnemyParty[i], MON_DATA_HP_EV + j, &gBattleResources->secretBase->partyEVs[i]);
SetMonData(&gEnemyParty[i], MON_DATA_HP_EV + j, &gBattleResources->secretBase->party.EVs[i]);
for (j = 0; j < 4; j++)
{
SetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j, &gBattleResources->secretBase->partyMoves[i * 4 + j]);
SetMonData(&gEnemyParty[i], MON_DATA_PP1 + j, &gBattleMoves[gBattleResources->secretBase->partyMoves[i * 4 + j]].pp);
SetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j, &gBattleResources->secretBase->party.moves[i * 4 + j]);
SetMonData(&gEnemyParty[i], MON_DATA_PP1 + j, &gBattleMoves[gBattleResources->secretBase->party.moves[i * 4 + j]].pp);
}
}
}
}
extern const u8 gUnknown_0831F578[];
extern const u8 gTrainerClassToNameIndex[];
extern const u8 gFacilityClassToPicIndex[];
extern const u8 gFacilityClassToTrainerClass[];
extern const u8 gSecretBaseTrainerClasses[][5];
u8 GetSecretBaseTrainerPicIndex(void)
{
u8 trainerClass = gSecretBaseTrainerClasses[gBattleResources->secretBase->gender][gBattleResources->secretBase->trainerId[0] % 5];
return gUnknown_0831F578[trainerClass];
return gFacilityClassToPicIndex[trainerClass];
}
u8 GetSecretBaseTrainerNameIndex(void)
{
u8 trainerClass = gSecretBaseTrainerClasses[gBattleResources->secretBase->gender][gBattleResources->secretBase->trainerId[0] % 5];
return gTrainerClassToNameIndex[trainerClass];
return gFacilityClassToTrainerClass[trainerClass];
}
bool8 IsPlayerPartyAndPokemonStorageFull(void)
@@ -1353,7 +1353,7 @@ void CopyPlayerPartyMonToBattleData(u8 bank, u8 partyIndex)
StringCopy10(gBattleMons[bank].nickname, nickname);
GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_NAME, gBattleMons[bank].otName);
hpSwitchout = &gBattleStruct->hpOnSwitchout[GetBankSide(bank)];
hpSwitchout = &gBattleStruct->hpOnSwitchout[GetBattlerSide(bank)];
*hpSwitchout = gBattleMons[bank].hp;
for (i = 0; i < 8; i++)
+47 -47
View File
@@ -25,15 +25,15 @@
extern struct BattlePokemon gBattleMons[4];
extern struct BattleEnigmaBerry gEnigmaBerries[4];
extern u8 gActiveBank;
extern u8 gBankInMenu;
extern u8 gBankTarget;
extern u8 gBankAttacker;
extern u8 gStringBank;
extern u8 gActiveBattler;
extern u8 gBattlerInMenuId;
extern u8 gBattlerTarget;
extern u8 gBattlerAttacker;
extern u8 gPotentialItemEffectBattler;
extern u16 gTrainerBattleOpponent_A;
extern u32 gBattleTypeFlags;
extern u8 gBattleMonForms[4];
extern u16 gBattlePartyID[4];
extern u16 gBattlerPartyIndexes[4];
extern u8 gLastUsedAbility;
extern u16 gPartnerTrainerId;
extern u32 gHitMarker;
@@ -113,7 +113,7 @@ u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit)
if (itemId == ITEM_ENIGMA_BERRY)
{
temp = gEnigmaBerries[gActiveBank].itemEffect;
temp = gEnigmaBerries[gActiveBattler].itemEffect;
}
itemEffect = temp;
@@ -210,7 +210,7 @@ u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit)
void sub_806CF24(s32 stat)
{
gBankTarget = gBankInMenu;
gBattlerTarget = gBattlerInMenuId;
StringCopy(gBattleTextBuff1, gStatNamesTable[gUnknown_08329EC8[stat]]);
StringCopy(gBattleTextBuff2, gText_StatRose);
BattleStringExpandPlaceholdersToDisplayedString(gText_PkmnsStatChanged2);
@@ -224,7 +224,7 @@ u8 *sub_806CF78(u16 itemId)
if (itemId == ITEM_ENIGMA_BERRY)
{
if (gMain.inBattle)
itemEffect = gEnigmaBerries[gBankInMenu].itemEffect;
itemEffect = gEnigmaBerries[gBattlerInMenuId].itemEffect;
else
itemEffect = gSaveBlock1Ptr->enigmaBerry.itemEffect;
}
@@ -233,7 +233,7 @@ u8 *sub_806CF78(u16 itemId)
itemEffect = gItemEffectTable[itemId - 13];
}
gStringBank = gBankInMenu;
gPotentialItemEffectBattler = gBattlerInMenuId;
for (i = 0; i < 3; i++)
{
@@ -247,7 +247,7 @@ u8 *sub_806CF78(u16 itemId)
}
else
{
gBankAttacker = gBankInMenu;
gBattlerAttacker = gBattlerInMenuId;
BattleStringExpandPlaceholdersToDisplayedString(gText_PkmnGettingPumped);
}
}
@@ -255,7 +255,7 @@ u8 *sub_806CF78(u16 itemId)
if (itemEffect[3] & 0x80)
{
gBankAttacker = gBankInMenu;
gBattlerAttacker = gBattlerInMenuId;
BattleStringExpandPlaceholdersToDisplayedString(gText_PkmnShroudedInMist);
}
@@ -301,56 +301,56 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem)
for (i = 0; i < 5; i++)
{
switch (gEvolutionTable[species].evolutions[i].method)
switch (gEvolutionTable[species][i].method)
{
case EVO_FRIENDSHIP:
if (friendship >= 220)
targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
targetSpecies = gEvolutionTable[species][i].targetSpecies;
break;
case EVO_FRIENDSHIP_DAY:
RtcCalcLocalTime();
if (gLocalTime.hours >= 12 && gLocalTime.hours < 24 && friendship >= 220)
targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
targetSpecies = gEvolutionTable[species][i].targetSpecies;
break;
case EVO_FRIENDSHIP_NIGHT:
RtcCalcLocalTime();
if (gLocalTime.hours >= 0 && gLocalTime.hours < 12 && friendship >= 220)
targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
targetSpecies = gEvolutionTable[species][i].targetSpecies;
break;
case EVO_LEVEL:
if (gEvolutionTable[species].evolutions[i].param <= level)
targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
if (gEvolutionTable[species][i].param <= level)
targetSpecies = gEvolutionTable[species][i].targetSpecies;
break;
case EVO_LEVEL_ATK_GT_DEF:
if (gEvolutionTable[species].evolutions[i].param <= level)
if (gEvolutionTable[species][i].param <= level)
if (GetMonData(mon, MON_DATA_ATK, 0) > GetMonData(mon, MON_DATA_DEF, 0))
targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
targetSpecies = gEvolutionTable[species][i].targetSpecies;
break;
case EVO_LEVEL_ATK_EQ_DEF:
if (gEvolutionTable[species].evolutions[i].param <= level)
if (gEvolutionTable[species][i].param <= level)
if (GetMonData(mon, MON_DATA_ATK, 0) == GetMonData(mon, MON_DATA_DEF, 0))
targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
targetSpecies = gEvolutionTable[species][i].targetSpecies;
break;
case EVO_LEVEL_ATK_LT_DEF:
if (gEvolutionTable[species].evolutions[i].param <= level)
if (gEvolutionTable[species][i].param <= level)
if (GetMonData(mon, MON_DATA_ATK, 0) < GetMonData(mon, MON_DATA_DEF, 0))
targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
targetSpecies = gEvolutionTable[species][i].targetSpecies;
break;
case EVO_LEVEL_SILCOON:
if (gEvolutionTable[species].evolutions[i].param <= level && (upperPersonality % 10) <= 4)
targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
if (gEvolutionTable[species][i].param <= level && (upperPersonality % 10) <= 4)
targetSpecies = gEvolutionTable[species][i].targetSpecies;
break;
case EVO_LEVEL_CASCOON:
if (gEvolutionTable[species].evolutions[i].param <= level && (upperPersonality % 10) > 4)
targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
if (gEvolutionTable[species][i].param <= level && (upperPersonality % 10) > 4)
targetSpecies = gEvolutionTable[species][i].targetSpecies;
break;
case EVO_LEVEL_NINJASK:
if (gEvolutionTable[species].evolutions[i].param <= level)
targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
if (gEvolutionTable[species][i].param <= level)
targetSpecies = gEvolutionTable[species][i].targetSpecies;
break;
case EVO_BEAUTY:
if (gEvolutionTable[species].evolutions[i].param <= beauty)
targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
if (gEvolutionTable[species][i].param <= beauty)
targetSpecies = gEvolutionTable[species][i].targetSpecies;
break;
}
}
@@ -358,17 +358,17 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem)
case 1:
for (i = 0; i < 5; i++)
{
switch (gEvolutionTable[species].evolutions[i].method)
switch (gEvolutionTable[species][i].method)
{
case EVO_TRADE:
targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
targetSpecies = gEvolutionTable[species][i].targetSpecies;
break;
case EVO_TRADE_ITEM:
if (gEvolutionTable[species].evolutions[i].param == heldItem)
if (gEvolutionTable[species][i].param == heldItem)
{
heldItem = 0;
SetMonData(mon, MON_DATA_HELD_ITEM, (u8 *)&heldItem);
targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
targetSpecies = gEvolutionTable[species][i].targetSpecies;
}
break;
}
@@ -378,10 +378,10 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem)
case 3:
for (i = 0; i < 5; i++)
{
if (gEvolutionTable[species].evolutions[i].method == EVO_ITEM
&& gEvolutionTable[species].evolutions[i].param == evolutionItem)
if (gEvolutionTable[species][i].method == EVO_ITEM
&& gEvolutionTable[species][i].param == evolutionItem)
{
targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
targetSpecies = gEvolutionTable[species][i].targetSpecies;
break;
}
}
@@ -615,7 +615,7 @@ bool16 sub_806D82C(u8 id)
return retVal;
}
s32 GetBankMultiplayerId(u16 a1)
s32 GetBattlerMultiplayerId(u16 a1)
{
s32 id;
for (id = 0; id < MAX_LINK_PLAYERS; id++)
@@ -1366,12 +1366,12 @@ void sub_806E994(void)
gBattleTextBuff1[2] = gBattleStruct->field_49;
gBattleTextBuff1[4] = B_BUFF_EOS;
if (!GetBankSide(gBattleStruct->field_49))
gBattleTextBuff1[3] = pokemon_order_func(gBattlePartyID[gBattleStruct->field_49]);
if (!GetBattlerSide(gBattleStruct->field_49))
gBattleTextBuff1[3] = pokemon_order_func(gBattlerPartyIndexes[gBattleStruct->field_49]);
else
gBattleTextBuff1[3] = gBattlePartyID[gBattleStruct->field_49];
gBattleTextBuff1[3] = gBattlerPartyIndexes[gBattleStruct->field_49];
PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff2, gBankInMenu, pokemon_order_func(gBattlePartyID[gBankInMenu]))
PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff2, gBattlerInMenuId, pokemon_order_func(gBattlerPartyIndexes[gBattlerInMenuId]))
BattleStringExpandPlaceholders(gText_PkmnsXPreventsSwitching, gStringVar4);
}
@@ -1478,7 +1478,7 @@ const u8 *GetTrainerPartnerName(void)
else
{
u8 id = GetMultiplayerId();
return gLinkPlayers[GetBankMultiplayerId(gLinkPlayers[id].lp_field_18 ^ 2)].name;
return gLinkPlayers[GetBattlerMultiplayerId(gLinkPlayers[id].lp_field_18 ^ 2)].name;
}
}
@@ -1652,11 +1652,11 @@ u8 sub_806EF84(u8 arg0, u8 arg1)
return i;
}
extern const u8 gUnknown_0831F578[];
extern const u8 gFacilityClassToPicIndex[];
u16 sub_806EFF0(u16 arg0)
{
return gUnknown_0831F578[arg0];
return gFacilityClassToPicIndex[arg0];
}
u16 PlayerGenderToFrontTrainerPicId(u8 playerGender)
+2 -2
View File
@@ -16,7 +16,7 @@ struct UnkAnimStruct
s16 field_8;
};
extern u16 gBattlePartyID[];
extern u16 gBattlerPartyIndexes[];
// this file's functions
static void pokemonanimfunc_00(struct Sprite *sprite);
@@ -945,7 +945,7 @@ void LaunchAnimationTaskForBackSprite(struct Sprite *sprite, u8 backAnimSet)
gTasks[taskId].tPtrHI = (u32)(sprite);
bank = sprite->data[0];
nature = GetNature(&gPlayerParty[gBattlePartyID[bank]]);
nature = GetNature(&gPlayerParty[gBattlerPartyIndexes[bank]]);
animId = 3 * backAnimSet + sBackAnimNatureModTable[nature];
gTasks[taskId].tAnimId = sBackAnimationIds[animId];
+1 -1
View File
@@ -71,7 +71,7 @@ static const union AffineAnimCmd *const sSpriteAffineAnimTable_8571730[] =
sSpriteAffineAnim_8571720
};
const struct TextColor gUnknown_08571734[] = {4, 0xF, 0xE};
const u8 gUnknown_08571734[] = {4, 0xF, 0xE};
const u8 gUnknown_08571737[] = _("/30");
// code
+4 -6
View File
@@ -20,6 +20,7 @@
#include "task.h"
#include "text.h"
#include "window.h"
#include "event_data.h"
struct ContestMove
{
@@ -36,8 +37,6 @@ struct ContestEffect
u8 jam;
};
extern struct UnkSummaryStruct* gUnknown_0203CF1C;
extern struct BgTemplate gUnknown_0861CBB4;
extern u8 gUnknown_0203CF20;
@@ -45,7 +44,6 @@ extern struct MusicPlayerInfo gMPlayInfo_BGM;
extern s8 gUnknown_0861CC1C[];
extern u8 gUnknown_08329D22[];
extern u8 gUnknown_0203CF21;
extern u16 gSpecialVar_0x8005;
extern struct UnkStruct_61CC04 gUnknown_0861CC04;
extern struct UnkStruct_61CC04 gUnknown_0861CC10;
extern struct UnkStruct_61CC04 gUnknown_0861CBEC;
@@ -54,7 +52,7 @@ extern u16 gSummaryScreenWindow_Tilemap[];
extern struct ContestMove gContestMoves[];
extern struct ContestEffect gContestEffects[];
extern struct WindowTemplate gUnknown_0861CC24;
extern struct TextColor gUnknown_0861CD2C[];
extern u8 gUnknown_0861CD2C[][3];
extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1];
extern u8 gText_MaleSymbol[];
extern u8 gText_FemaleSymbol[];
@@ -162,7 +160,7 @@ extern struct BattleMove gBattleMoves[];
extern u32 ChangeBgX(u8 bg, u32 value, u8 op);
extern void sub_8199C30(u8 a, u8 b, u8 c, u8 d, u8 e, u8 f);
extern void AddTextPrinterParameterized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, struct TextColor* colors, s8 speed, u8 *str);
extern void AddTextPrinterParameterized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, const u8* colors, s8 speed, u8 *str);
extern s32 GetStringCenterAlignXOffset(u8 fontId, u8 *str, s32 totalWidth);
extern s32 GetStringRightAlignXOffset(u8 fontId, u8 *str, s32 totalWidth);
extern bool8 sub_81A6BF4();
@@ -2557,7 +2555,7 @@ void sub_81C2554()
void sub_81C25A4(u8 a, u8 *b, u8 c, u8 d, u8 e, u8 f)
{
AddTextPrinterParameterized2(a, 1, c, d, 0, e, &gUnknown_0861CD2C[f], 0, b);
AddTextPrinterParameterized2(a, 1, c, d, 0, e, gUnknown_0861CD2C[f], 0, b);
}
void sub_81C25E8()
+1840 -72
View File
File diff suppressed because it is too large Load Diff
+71 -79
View File
@@ -13,23 +13,15 @@
#include "util.h"
#include "task.h"
#include "text.h"
#include "battle_setup.h"
#define BANK_RECORD_SIZE 664
#define BATTLER_RECORD_SIZE 664
#define ILLEGAL_BATTLE_TYPES ((BATTLE_TYPE_LINK | BATTLE_TYPE_SAFARI | BATTLE_TYPE_FIRST_BATTLE \
| BATTLE_TYPE_WALLY_TUTORIAL | BATTLE_TYPE_ROAMER | BATTLE_TYPE_EREADER_TRAINER \
| BATTLE_TYPE_KYOGRE_GROUDON | BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_REGI \
| BATTLE_TYPE_RECORDED | BATTLE_TYPE_x4000000 | BATTLE_TYPE_SECRET_BASE \
| BATTLE_TYPE_GROUDON | BATTLE_TYPE_KYOGRE | BATTLE_TYPE_RAYQUAZA))
extern u32 gBattleTypeFlags;
extern u16 gTrainerBattleOpponent_A;
extern u16 gTrainerBattleOpponent_B;
extern u16 gPartnerTrainerId;
extern u8 gActiveBank;
extern u8 gNoOfAllBanks;
extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT];
extern u16 gChosenMovesByBanks[BATTLE_BANKS_COUNT];
extern u8 gUnknown_03001278;
extern u8 gUnknown_03001279;
@@ -38,7 +30,7 @@ struct PlayerInfo
u32 trainerId;
u8 name[PLAYER_NAME_LENGTH];
u8 gender;
u16 bank;
u16 battlerId;
u16 language;
};
@@ -52,13 +44,13 @@ struct RecordedBattleSave
{
struct Pokemon playerParty[PARTY_SIZE];
struct Pokemon opponentParty[PARTY_SIZE];
u8 playersName[BATTLE_BANKS_COUNT][PLAYER_NAME_LENGTH];
u8 playersGender[BATTLE_BANKS_COUNT];
u32 playersTrainerId[BATTLE_BANKS_COUNT];
u8 playersLanguage[BATTLE_BANKS_COUNT];
u8 playersName[MAX_BATTLERS_COUNT][PLAYER_NAME_LENGTH];
u8 playersGender[MAX_BATTLERS_COUNT];
u32 playersTrainerId[MAX_BATTLERS_COUNT];
u8 playersLanguage[MAX_BATTLERS_COUNT];
u32 rngSeed;
u32 battleFlags;
u8 playersBank[BATTLE_BANKS_COUNT];
u8 playersBattlers[MAX_BATTLERS_COUNT];
u16 opponentA;
u16 opponentB;
u16 partnerId;
@@ -75,14 +67,14 @@ struct RecordedBattleSave
u16 field_50E[6];
u8 field_51A;
u8 field_51B;
u8 battleRecord[BATTLE_BANKS_COUNT][BANK_RECORD_SIZE];
u8 battleRecord[MAX_BATTLERS_COUNT][BATTLER_RECORD_SIZE];
u32 checksum;
};
EWRAM_DATA u32 gRecordedBattleRngSeed = 0;
EWRAM_DATA u32 gBattlePalaceMoveSelectionRngValue = 0;
EWRAM_DATA static u8 sBattleRecords[BATTLE_BANKS_COUNT][BANK_RECORD_SIZE] = {0};
EWRAM_DATA static u16 sRecordedBytesNo[BATTLE_BANKS_COUNT] = {0};
EWRAM_DATA static u8 sBattleRecords[MAX_BATTLERS_COUNT][BATTLER_RECORD_SIZE] = {0};
EWRAM_DATA static u16 sRecordedBytesNo[MAX_BATTLERS_COUNT] = {0};
EWRAM_DATA static u16 sUnknown_0203C79C[4] = {0};
EWRAM_DATA static u16 sUnknown_0203C7A4[4] = {0};
EWRAM_DATA static u8 sUnknown_0203C7AC = 0;
@@ -99,7 +91,7 @@ EWRAM_DATA static u32 sRecordedBattle_AI_Scripts = 0;
EWRAM_DATA static struct Pokemon sSavedPlayerParty[PARTY_SIZE] = {0};
EWRAM_DATA static struct Pokemon sSavedOpponentParty[PARTY_SIZE] = {0};
EWRAM_DATA static u16 sRecordedBattle_PlayerMonMoves[2][4] = {0};
EWRAM_DATA static struct PlayerInfo sRecordedBattle_Players[BATTLE_BANKS_COUNT] = {0};
EWRAM_DATA static struct PlayerInfo sRecordedBattle_Players[MAX_BATTLERS_COUNT] = {0};
EWRAM_DATA static u8 sUnknown_0203CCD0 = 0;
EWRAM_DATA static u8 sUnknown_0203CCD1[8] = {0};
EWRAM_DATA static u8 sUnknown_0203CCD9 = 0;
@@ -123,7 +115,7 @@ void sub_8184DA4(u8 arg0)
sUnknown_0203C7AC = arg0;
sUnknown_0203CCD0 = 0;
for (i = 0; i < BATTLE_BANKS_COUNT; i++)
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
sRecordedBytesNo[i] = 0;
sUnknown_0203C79C[i] = 0;
@@ -131,7 +123,7 @@ void sub_8184DA4(u8 arg0)
if (arg0 == 1)
{
for (j = 0; j < BANK_RECORD_SIZE; j++)
for (j = 0; j < BATTLER_RECORD_SIZE; j++)
{
sBattleRecords[i][j] |= 0xFF;
}
@@ -164,11 +156,11 @@ void sub_8184E58(void)
gUnknown_0203C7B4 = GetMultiplayerId();
linkPlayersCount = GetLinkPlayerCount();
for (i = 0; i < BATTLE_BANKS_COUNT; i++)
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
sRecordedBattle_Players[i].trainerId = gLinkPlayers[i].trainerId;
sRecordedBattle_Players[i].gender = gLinkPlayers[i].gender;
sRecordedBattle_Players[i].bank = gLinkPlayers[i].lp_field_18;
sRecordedBattle_Players[i].battlerId = gLinkPlayers[i].lp_field_18;
sRecordedBattle_Players[i].language = gLinkPlayers[i].language;
if (i < linkPlayersCount)
@@ -192,7 +184,7 @@ void sub_8184E58(void)
| (gSaveBlock2Ptr->playerTrainerId[3] << 24);
sRecordedBattle_Players[0].gender = gSaveBlock2Ptr->playerGender;
sRecordedBattle_Players[0].bank = 0;
sRecordedBattle_Players[0].battlerId = 0;
sRecordedBattle_Players[0].language = gGameLanguage;
for (i = 0; i < PLAYER_NAME_LENGTH; i++)
@@ -200,33 +192,33 @@ void sub_8184E58(void)
}
}
void RecordedBattle_SetBankAction(u8 bank, u8 action)
void RecordedBattle_SetBattlerAction(u8 battlerId, u8 action)
{
if (sRecordedBytesNo[bank] < BANK_RECORD_SIZE && sUnknown_0203C7AC != 2)
if (sRecordedBytesNo[battlerId] < BATTLER_RECORD_SIZE && sUnknown_0203C7AC != 2)
{
sBattleRecords[bank][sRecordedBytesNo[bank]++] = action;
sBattleRecords[battlerId][sRecordedBytesNo[battlerId]++] = action;
}
}
void RecordedBattle_ClearBankAction(u8 bank, u8 bytesToClear)
void RecordedBattle_ClearBattlerAction(u8 battlerId, u8 bytesToClear)
{
s32 i;
for (i = 0; i < bytesToClear; i++)
{
sRecordedBytesNo[bank]--;
sBattleRecords[bank][sRecordedBytesNo[bank]] |= 0xFF;
if (sRecordedBytesNo[bank] == 0)
sRecordedBytesNo[battlerId]--;
sBattleRecords[battlerId][sRecordedBytesNo[battlerId]] |= 0xFF;
if (sRecordedBytesNo[battlerId] == 0)
break;
}
}
u8 RecordedBattle_ReadBankAction(u8 bank)
u8 RecordedBattle_GetBattlerAction(u8 battlerId)
{
// trying to read past array or invalid action byte, battle is over
if (sRecordedBytesNo[bank] >= BANK_RECORD_SIZE || sBattleRecords[bank][sRecordedBytesNo[bank]] == 0xFF)
if (sRecordedBytesNo[battlerId] >= BATTLER_RECORD_SIZE || sBattleRecords[battlerId][sRecordedBytesNo[battlerId]] == 0xFF)
{
gSpecialVar_Result = gBattleOutcome = BATTLE_PLAYER_TELEPORTED; // hah
gSpecialVar_Result = gBattleOutcome = B_OUTCOME_PLAYER_TELEPORTED; // hah
ResetPaletteFadeControl();
BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
SetMainCallback2(CB2_QuitRecordedBattle);
@@ -234,7 +226,7 @@ u8 RecordedBattle_ReadBankAction(u8 bank)
}
else
{
return sBattleRecords[bank][sRecordedBytesNo[bank]++];
return sBattleRecords[battlerId][sRecordedBytesNo[battlerId]++];
}
}
@@ -248,7 +240,7 @@ u8 sub_81850DC(u8 *arg0)
u8 i, j;
u8 ret = 0;
for (i = 0; i < BATTLE_BANKS_COUNT; i++)
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
if (sRecordedBytesNo[i] != sUnknown_0203C79C[i])
{
@@ -350,7 +342,7 @@ u32 MoveRecordedBattleToSaveData(void)
battleSave->opponentParty[i] = sSavedOpponentParty[i];
}
for (i = 0; i < BATTLE_BANKS_COUNT; i++)
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
for (j = 0; j < PLAYER_NAME_LENGTH; j++)
{
@@ -358,7 +350,7 @@ u32 MoveRecordedBattleToSaveData(void)
}
battleSave->playersGender[i] = sRecordedBattle_Players[i].gender;
battleSave->playersLanguage[i] = sRecordedBattle_Players[i].language;
battleSave->playersBank[i] = sRecordedBattle_Players[i].bank;
battleSave->playersBattlers[i] = sRecordedBattle_Players[i].battlerId;
battleSave->playersTrainerId[i] = sRecordedBattle_Players[i].trainerId;
}
@@ -375,16 +367,16 @@ u32 MoveRecordedBattleToSaveData(void)
}
else if (sRecordedBattle_BattleFlags & BATTLE_TYPE_MULTI)
{
switch (sRecordedBattle_Players[0].bank)
switch (sRecordedBattle_Players[0].battlerId)
{
case 0:
case 2:
if (!(sRecordedBattle_Players[gUnknown_0203C7B4].bank & 1))
if (!(sRecordedBattle_Players[gUnknown_0203C7B4].battlerId & 1))
battleSave->battleFlags |= BATTLE_TYPE_x80000000;
break;
case 1:
case 3:
if ((sRecordedBattle_Players[gUnknown_0203C7B4].bank & 1))
if ((sRecordedBattle_Players[gUnknown_0203C7B4].battlerId & 1))
battleSave->battleFlags |= BATTLE_TYPE_x80000000;
break;
}
@@ -1339,7 +1331,7 @@ static void SetRecordedBattleVarsFromSave(struct RecordedBattleSave *src)
gEnemyParty[i] = src->opponentParty[i];
}
for (i = 0; i < BATTLE_BANKS_COUNT; i++)
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
for (var = FALSE, j = 0; j < PLAYER_NAME_LENGTH; j++)
{
@@ -1349,7 +1341,7 @@ static void SetRecordedBattleVarsFromSave(struct RecordedBattleSave *src)
}
gLinkPlayers[i].gender = src->playersGender[i];
gLinkPlayers[i].language = src->playersLanguage[i];
gLinkPlayers[i].lp_field_18 = src->playersBank[i];
gLinkPlayers[i].lp_field_18 = src->playersBattlers[i];
gLinkPlayers[i].trainerId = src->playersTrainerId[i];
if (var)
@@ -1386,9 +1378,9 @@ static void SetRecordedBattleVarsFromSave(struct RecordedBattleSave *src)
gSaveBlock2Ptr->frontierChosenLvl = src->field_4FC;
for (i = 0; i < BATTLE_BANKS_COUNT; i++)
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
for (j = 0; j < BANK_RECORD_SIZE; j++)
for (j = 0; j < BATTLER_RECORD_SIZE; j++)
{
sBattleRecords[i][j] = src->battleRecord[i][j];
}
@@ -1456,13 +1448,13 @@ static void RecordedBattle_RestoreSavedParties(void)
}
}
u8 GetActiveBankLinkPlayerGender(void)
u8 GetActiveBattlerLinkPlayerGender(void)
{
s32 i;
for (i = 0; i < MAX_LINK_PLAYERS; i++)
{
if (gLinkPlayers[i].lp_field_18 == gActiveBank)
if (gLinkPlayers[i].lp_field_18 == gActiveBattler)
break;
}
@@ -1497,11 +1489,11 @@ u8 GetTextSpeedInRecordedBattle(void)
return sRecordedBattle_TextSpeed;
}
void RecordedBattle_CopyBankMoves(void)
void RecordedBattle_CopyBattlerMoves(void)
{
s32 i;
if (GetBankSide(gActiveBank) == SIDE_OPPONENT)
if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT)
return;
if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
return;
@@ -1510,7 +1502,7 @@ void RecordedBattle_CopyBankMoves(void)
for (i = 0; i < 4; i++)
{
sRecordedBattle_PlayerMonMoves[gActiveBank / 2][i] = gBattleMons[gActiveBank].moves[i];
sRecordedBattle_PlayerMonMoves[gActiveBattler / 2][i] = gBattleMons[gActiveBattler].moves[i];
}
}
@@ -1518,32 +1510,32 @@ void RecordedBattle_CopyBankMoves(void)
void sub_818603C(u8 arg0)
{
s32 bank, j, k;
s32 battlerId, j, k;
if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
return;
for (bank = 0; bank < gNoOfAllBanks; bank++)
for (battlerId = 0; battlerId < gBattlersCount; battlerId++)
{
if (GetBankSide(bank) != SIDE_OPPONENT) // player's side only
if (GetBattlerSide(battlerId) != B_SIDE_OPPONENT) // player's side only
{
if (arg0 == 1)
{
for (j = 0; j < 4; j++)
{
if (gBattleMons[bank].moves[j] != sRecordedBattle_PlayerMonMoves[bank / 2][j])
if (gBattleMons[battlerId].moves[j] != sRecordedBattle_PlayerMonMoves[battlerId / 2][j])
break;
}
if (j != 4) // player's mon's move has been changed
{
RecordedBattle_SetBankAction(bank, ACTION_MOVE_CHANGE);
RecordedBattle_SetBattlerAction(battlerId, ACTION_MOVE_CHANGE);
for (j = 0; j < 4; j++)
{
for (k = 0; k < 4; k++)
{
if (gBattleMons[bank].moves[j] == sRecordedBattle_PlayerMonMoves[bank / 2][k])
if (gBattleMons[battlerId].moves[j] == sRecordedBattle_PlayerMonMoves[battlerId / 2][k])
{
RecordedBattle_SetBankAction(bank, k);
RecordedBattle_SetBattlerAction(battlerId, k);
break;
}
}
@@ -1552,7 +1544,7 @@ void sub_818603C(u8 arg0)
}
else
{
if (sBattleRecords[bank][sRecordedBytesNo[bank]] == ACTION_MOVE_CHANGE)
if (sBattleRecords[battlerId][sRecordedBytesNo[battlerId]] == ACTION_MOVE_CHANGE)
{
u8 ppBonuses[4];
u8 array1[4];
@@ -1561,58 +1553,58 @@ void sub_818603C(u8 arg0)
u8 array3[8];
u8 var;
RecordedBattle_ReadBankAction(bank);
RecordedBattle_GetBattlerAction(battlerId);
for (j = 0; j < 4; j++)
{
ppBonuses[j] = ((gBattleMons[bank].ppBonuses & ((3 << (j << 1)))) >> (j << 1));
ppBonuses[j] = ((gBattleMons[battlerId].ppBonuses & ((3 << (j << 1)))) >> (j << 1));
}
for (j = 0; j < 4; j++)
{
array1[j] = RecordedBattle_ReadBankAction(bank);
movePp.moves[j] = gBattleMons[bank].moves[array1[j]];
movePp.pp[j] = gBattleMons[bank].pp[array1[j]];
array1[j] = RecordedBattle_GetBattlerAction(battlerId);
movePp.moves[j] = gBattleMons[battlerId].moves[array1[j]];
movePp.pp[j] = gBattleMons[battlerId].pp[array1[j]];
array3[j] = ppBonuses[array1[j]];
array2[j] = (gDisableStructs[bank].unk18_b & gBitTable[j]) >> j;
array2[j] = (gDisableStructs[battlerId].unk18_b & gBitTable[j]) >> j;
}
for (j = 0; j < 4; j++)
{
gBattleMons[bank].moves[j] = movePp.moves[j];
gBattleMons[bank].pp[j] = movePp.pp[j];
gBattleMons[battlerId].moves[j] = movePp.moves[j];
gBattleMons[battlerId].pp[j] = movePp.pp[j];
}
gBattleMons[bank].ppBonuses = 0;
gDisableStructs[bank].unk18_b = 0;
gBattleMons[battlerId].ppBonuses = 0;
gDisableStructs[battlerId].unk18_b = 0;
for (j = 0; j < 4; j++)
{
gBattleMons[bank].ppBonuses |= (array3[j]) << (j << 1);
gDisableStructs[bank].unk18_b |= (array2[j]) << (j);
gBattleMons[battlerId].ppBonuses |= (array3[j]) << (j << 1);
gDisableStructs[battlerId].unk18_b |= (array2[j]) << (j);
}
if (!(gBattleMons[bank].status2 & STATUS2_TRANSFORMED))
if (!(gBattleMons[battlerId].status2 & STATUS2_TRANSFORMED))
{
for (j = 0; j < 4; j++)
{
ppBonuses[j] = ((GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_PP_BONUSES, NULL) & ((3 << (j << 1)))) >> (j << 1));
ppBonuses[j] = ((GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PP_BONUSES, NULL) & ((3 << (j << 1)))) >> (j << 1));
}
for (j = 0; j < 4; j++)
{
movePp.moves[j] = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_MOVE1 + array1[j], NULL);
movePp.pp[j] = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_PP1 + array1[j], NULL);
movePp.moves[j] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_MOVE1 + array1[j], NULL);
movePp.pp[j] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PP1 + array1[j], NULL);
array3[j] = ppBonuses[array1[j]];
}
for (j = 0; j < 4; j++)
{
SetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_MOVE1 + j, &movePp.moves[j]);
SetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_PP1 + j, &movePp.pp[j]);
SetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_MOVE1 + j, &movePp.moves[j]);
SetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PP1 + j, &movePp.pp[j]);
}
var = 0;
for (j = 0; j < 4; j++)
{
var |= (array3[j]) << (j << 1);
}
SetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_PP_BONUSES, &var);
SetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PP_BONUSES, &var);
}
gChosenMovesByBanks[bank] = gBattleMons[bank].moves[*(gBattleStruct->chosenMovePositions + bank)];
gChosenMoveByBattler[battlerId] = gBattleMons[battlerId].moves[*(gBattleStruct->chosenMovePositions + battlerId)];
}
}
}
+639
View File
@@ -0,0 +1,639 @@
#include "global.h"
#include "reset_rtc_screen.h"
#include "event_data.h"
#include "main.h"
#include "menu.h"
#include "palette.h"
#include "rtc.h"
#include "save.h"
#include "sprite.h"
#include "constants/songs.h"
#include "sound.h"
#include "string_util.h"
#include "strings.h"
#include "task.h"
#include "text.h"
#include "scanline_effect.h"
#include "bg.h"
#include "window.h"
#include "gpu_regs.h"
struct ResetRtcStruct
{
/*0x0*/ u8 dataIndex;
/*0x2*/ u16 minVal;
/*0x4*/ u16 maxVal;
/*0x6*/ u8 left;
/*0x7*/ u8 right;
/*0x8*/ u8 unk8;
};
// this file's functions
static void CB2_ResetRtcScreen(void);
static void VBlankCB(void);
static void Task_ResetRtcScreen(u8 taskId);
static void sub_809F048(void);
// const rom data
static const struct BgTemplate sBackgroundTemplates[] =
{
{
.bg = 0,
.charBaseIndex = 0,
.mapBaseIndex = 31,
.screenSize = 0,
.paletteMode = 0,
.priority = 0,
.baseTile = 0
}
};
static const struct WindowTemplate sUnknown_08510408[] =
{
{0x00, 0x01, 0x01, 0x13, 0x09, 0x0f, 0x0155},
{0x00, 0x02, 0x0f, 0x1b, 0x04, 0x0f, 0x00e9},
DUMMY_WIN_TEMPLATE
};
static const struct WindowTemplate sUnknown_08510420 = {0x00, 0x04, 0x09, 0x15, 0x02, 0x0f, 0x00bf};
static const struct ResetRtcStruct sUnknown_08510428[5] =
{
{
.dataIndex = 3,
.minVal = 1,
.maxVal = 9999,
.left = 0,
.right = 2,
.unk8 = 0,
},
{
.dataIndex = 4,
.minVal = 0,
.maxVal = 23,
.left = 1,
.right = 3,
.unk8 = 0,
},
{
.dataIndex = 5,
.minVal = 0,
.maxVal = 59,
.left = 2,
.right = 4,
.unk8 = 0,
},
{
.dataIndex = 6,
.minVal = 0,
.maxVal = 59,
.left = 3,
.right = 5,
.unk8 = 0,
},
{
.dataIndex = 7,
.minVal = 0,
.maxVal = 0,
.left = 4,
.right = 0,
.unk8 = 6,
},
};
static const struct OamData sOamData_08510464 =
{
.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,
};
static const u8 sResetRtcScreen_DownArrowGfx[] = INCBIN_U8("graphics/misc/reset_rtc_screen_downarrow.4bpp");
static const u8 sResetRtcScreen_RightArrowGfx[] = INCBIN_U8("graphics/misc/reset_rtc_screen_rightarrow.4bpp");
static const u16 sResetRtcScreen_ArrowPal[] = INCBIN_U16("graphics/misc/reset_rtc_screen_arrow.gbapal");
static const struct SpriteFrameImage sSpriteImageTable_85104B4[] =
{
obj_frame_tiles(sResetRtcScreen_DownArrowGfx),
obj_frame_tiles(sResetRtcScreen_RightArrowGfx)
};
static const struct SpritePalette sSpritePalette_Arrow =
{
sResetRtcScreen_ArrowPal, 0x1000
};
static const union AnimCmd sSpriteAnim_85104CC[] =
{
ANIMCMD_FRAME(0, 30),
ANIMCMD_JUMP(0),
};
static const union AnimCmd sSpriteAnim_85104D4[] =
{
ANIMCMD_FRAME(0, 158, .vFlip = TRUE),
ANIMCMD_JUMP(0),
};
static const union AnimCmd sSpriteAnim_85104DC[] =
{
ANIMCMD_FRAME(1, 30),
ANIMCMD_JUMP(0),
};
static const union AnimCmd *const sSpriteAnimTable_85104E4[] =
{
sSpriteAnim_85104CC,
sSpriteAnim_85104D4,
sSpriteAnim_85104DC,
};
static const struct SpriteTemplate sSpriteTemplate_85104F0 =
{
.tileTag = 0xFFFF,
.paletteTag = 0x1000,
.oam = &sOamData_08510464,
.anims = sSpriteAnimTable_85104E4,
.images = sSpriteImageTable_85104B4,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy,
};
// code
static void SpriteCB_ResetRtcCursor0(struct Sprite *sprite)
{
int state = gTasks[sprite->data[0]].data[2];
if (state != sprite->data[1])
{
sprite->data[1] = 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 = 101;
sprite->pos1.y = 68;
break;
case 4:
sprite->invisible = FALSE;
sprite->animNum = 1;
sprite->animDelayCounter = 0;
sprite->pos1.x = 116;
sprite->pos1.y = 68;
break;
case 5:
sprite->invisible = FALSE;
sprite->animNum = 2;
sprite->animDelayCounter = 0;
sprite->pos1.x = 153;
sprite->pos1.y = 80;
break;
case 6:
DestroySprite(sprite);
break;
}
}
}
static void SpriteCB_ResetRtcCursor1(struct Sprite *sprite)
{
int state = gTasks[sprite->data[0]].data[2];
if (state != sprite->data[1])
{
sprite->data[1] = 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 = 101;
sprite->pos1.y = 92;
break;
case 4:
sprite->invisible = FALSE;
sprite->animNum = 0;
sprite->animDelayCounter = 0;
sprite->pos1.x = 116;
sprite->pos1.y = 92;
break;
case 5:
sprite->invisible = TRUE;
break;
case 6:
DestroySprite(sprite);
break;
}
}
}
static void CreateCursor(u8 taskId)
{
u32 spriteId;
LoadSpritePalette(&sSpritePalette_Arrow);
spriteId = CreateSpriteAtEnd(&sSpriteTemplate_85104F0, 53, 68, 0);
gSprites[spriteId].callback = SpriteCB_ResetRtcCursor0;
gSprites[spriteId].data[0] = taskId;
gSprites[spriteId].data[1] = -1;
spriteId = CreateSpriteAtEnd(&sSpriteTemplate_85104F0, 53, 68, 0);
gSprites[spriteId].callback = SpriteCB_ResetRtcCursor1;
gSprites[spriteId].data[0] = taskId;
gSprites[spriteId].data[1] = -1;
}
static void FreeCursorPalette(void)
{
FreeSpritePaletteByTag(sSpritePalette_Arrow.tag);
}
static void HideChooseTimeWindow(u8 windowId)
{
sub_8198070(windowId, FALSE);
RemoveWindow(windowId);
schedule_bg_copy_tilemap_to_vram(0);
}
static void PrintTime(u8 windowId, u8 x, u8 y, u16 days, u8 hours, u8 minutes, u8 seconds)
{
u8 *dest = gStringVar4;
ConvertIntToDecimalStringN(gStringVar1, days, 1, 4);
dest = StringCopy(dest, gStringVar1);
dest = StringCopy(dest, gText_Day);
ConvertIntToDecimalStringN(gStringVar1, hours, 1, 3);
dest = StringCopy(dest, gStringVar1);
dest = StringCopy(dest, gText_Colon3);
ConvertIntToDecimalStringN(gStringVar1, minutes, 2, 2);
dest = StringCopy(dest, gStringVar1);
dest = StringCopy(dest, gText_Colon3);
ConvertIntToDecimalStringN(gStringVar1, seconds, 2, 2);
dest = StringCopy(dest, gStringVar1);
PrintTextOnWindow(windowId, 1, gStringVar4, x, y, TEXT_SPEED_FF, NULL);
}
static void ShowChooseTimeWindow(u8 windowId, u16 days, u8 hours, u8 minutes, u8 seconds)
{
SetWindowBorderStyle(windowId, FALSE, 0x214, 0xE);
PrintTime(windowId, 0, 1, days, hours, minutes, seconds);
PrintTextOnWindow(windowId, 1, gText_Confirm2, 126, 1, 0, NULL);
schedule_bg_copy_tilemap_to_vram(0);
}
static bool32 MoveTimeUpDown(s16 *val, int minVal, int maxVal, u16 keys)
{
if (keys & DPAD_DOWN)
{
*val -= 1;
if (*val < minVal)
*val = maxVal;
}
else if (keys & DPAD_UP)
{
*val += 1;
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;
}
static void Task_ResetRtc_3(u8 taskId)
{
gTasks[taskId].data[0] = 1;
}
static void Task_ResetRtc_2(u8 taskId)
{
s16 *data = gTasks[taskId].data;
HideChooseTimeWindow(data[8]);
FreeCursorPalette();
gTasks[taskId].func = Task_ResetRtc_3;
}
static void Task_ResetRtc_1(u8 taskId)
{
s16 *data = gTasks[taskId].data;
u8 selection = data[2];
const struct ResetRtcStruct *selectionInfo = &sUnknown_08510428[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 (MoveTimeUpDown(&data[selectionInfo->dataIndex], selectionInfo->minVal, selectionInfo->maxVal, gMain.newAndRepeatedKeys & (DPAD_UP | DPAD_DOWN)))
{
PlaySE(SE_SELECT);
PrintTime(data[8], 0, 1, data[3], data[4], data[5], data[6]);
CopyWindowToVram(data[8], 2);
}
}
static 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;
data[8] = AddWindow(&sUnknown_08510420);
ShowChooseTimeWindow(data[8], data[3], data[4], data[5], data[6]);
CreateCursor(taskId);
data[2] = 2;
gTasks[taskId].func = Task_ResetRtc_1;
}
void CB2_InitResetRtcScreen(void)
{
SetGpuReg(REG_OFFSET_DISPCNT, 0);
SetVBlankCallback(NULL);
DmaClear16(3, PLTT, PLTT_SIZE);
DmaFillLarge16(3, 0, (u8 *)VRAM, 0x18000, 0x1000);
ResetOamRange(0, 128);
LoadOam();
ScanlineEffect_Stop();
ScanlineEffect_Clear();
ResetSpriteData();
ResetTasks();
ResetPaletteFade();
sub_809F048();
SetVBlankCallback(VBlankCB);
SetMainCallback2(CB2_ResetRtcScreen);
CreateTask(Task_ResetRtcScreen, 80);
}
static void sub_809F048(void)
{
clear_scheduled_bg_copies_to_vram();
ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(0, sBackgroundTemplates, ARRAY_COUNT(sBackgroundTemplates));
schedule_bg_copy_tilemap_to_vram(0);
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
ShowBg(0);
InitWindows(sUnknown_08510408);
DeactivateAllTextPrinters();
sub_81973A4();
}
static void CB2_ResetRtcScreen(void)
{
RunTasks();
AnimateSprites();
BuildOamBuffer();
do_scheduled_bg_tilemap_copies_to_vram();
UpdatePaletteFade();
}
static void VBlankCB(void)
{
ProcessSpriteCopyRequests();
LoadOam();
TransferPlttBuffer();
}
static void ShowMessage(const u8 *str)
{
sub_8197B1C(1, FALSE, 0x200, 0xF);
PrintTextOnWindow(1, 1, str, 0, 1, 0, NULL);
schedule_bg_copy_tilemap_to_vram(0);
}
static void Task_ShowResetRtcPrompt(u8 taskId)
{
s16 *data = gTasks[taskId].data;
switch (data[0])
{
case 0:
SetWindowBorderStyle(0, FALSE, 0x214, 0xE);
PrintTextOnWindow(0, 1, gText_PresentTime, 0, 1, TEXT_SPEED_FF, 0);
PrintTime(
0,
0,
17,
gLocalTime.days,
gLocalTime.hours,
gLocalTime.minutes,
gLocalTime.seconds);
PrintTextOnWindow(0, 1, gText_PreviousTime, 0, 33, TEXT_SPEED_FF, 0);
PrintTime(
0,
0,
49,
gSaveBlock2Ptr->lastBerryTreeUpdate.days,
gSaveBlock2Ptr->lastBerryTreeUpdate.hours,
gSaveBlock2Ptr->lastBerryTreeUpdate.minutes,
gSaveBlock2Ptr->lastBerryTreeUpdate.seconds);
ShowMessage(gText_ResetRTCConfirmCancel);
CopyWindowToVram(0, 2);
schedule_bg_copy_tilemap_to_vram(0);
data[0]++;
case 1:
if (gMain.newKeys & B_BUTTON)
{
DestroyTask(taskId);
DoSoftReset();
}
else if (gMain.newKeys & A_BUTTON)
{
PlaySE(SE_SELECT);
DestroyTask(taskId);
}
break;
}
}
static void Task_ResetRtcScreen(u8 taskId)
{
s16 *data = gTasks[taskId].data;
switch (data[0])
{
case 0:
BeginNormalPaletteFade(-1, 1, 0x10, 0, 0xFFFF);
data[0] = 1;
break;
case 1:
if (!gPaletteFade.active)
{
if (gSaveFileStatus == 0 || gSaveFileStatus == 2)
{
ShowMessage(gText_NoSaveFileCantSetTime);
data[0] = 5;
}
else
{
RtcCalcLocalTime();
data[1] = CreateTask(Task_ShowResetRtcPrompt, 80);
data[0] = 2;
}
}
break;
case 2:
if (gTasks[data[1]].isActive != TRUE)
{
sub_8198070(0, FALSE);
ShowMessage(gText_PleaseResetTime);
gLocalTime = gSaveBlock2Ptr->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);
gSaveBlock2Ptr->lastBerryTreeUpdate = gLocalTime;
VarSet(VAR_DAYS, gLocalTime.days);
DisableResetRTC();
ShowMessage(gText_ClockHasBeenReset);
data[0] = 4;
}
}
break;
case 4:
if (TrySavingData(0) == 1)
{
ShowMessage(gText_SaveCompleted);
PlaySE(SE_PINPON);
}
else
{
ShowMessage(gText_SaveFailed);
PlaySE(SE_BOO);
}
data[0] = 5;
case 5:
if (gMain.newKeys & A_BUTTON)
{
BeginNormalPaletteFade(-1, 1, 0, 0x10, 0xFFFF);
data[0] = 6;
}
else
{
break;
}
case 6:
if (!gPaletteFade.active)
{
DestroyTask(taskId);
FreeAllWindowBuffers();
DoSoftReset();
}
}
}
+1 -1
View File
@@ -15,7 +15,7 @@ void sub_81700F8(void)
imeBackup = REG_IME;
REG_IME = 0;
RegisterRamReset(0x00000001);
ClearGpuRegBits(REG_OFFSET_DISPCNT, 0x80);
ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_FORCED_BLANK);
REG_IME = imeBackup;
gMain.inBattle = FALSE;
SetSaveBlocksPointers(sub_815355C());
+87 -102
View File
@@ -12,6 +12,7 @@
#include "sprite.h"
#include "constants/species.h"
#include "battle_interface.h"
#include "battle_anim.h"
extern u16 gBattle_BG0_X;
extern u16 gBattle_BG0_Y;
@@ -21,33 +22,17 @@ extern u16 gBattle_BG2_X;
extern u16 gBattle_BG2_Y;
extern u16 gBattle_BG3_X;
extern u16 gBattle_BG3_Y;
extern u8 gReservedSpritePaletteCount;
extern u8 gActionSelectionCursor[BATTLE_BANKS_COUNT];
extern u8 gBankInMenu;
extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
extern u8 gNoOfAllBanks;
extern u32 gBattleTypeFlags;
extern u8 gBankSpriteIds[BATTLE_BANKS_COUNT];
extern u8 gBattleMonForms[BATTLE_BANKS_COUNT];
extern u8 gHealthBoxesIds[BATTLE_BANKS_COUNT];
extern struct SpriteTemplate gUnknown_0202499C;
extern const union AnimCmd * const * const gMonAnimationsSpriteAnimsPtrTable[];
extern void ScanlineEffect_Clear(void);
extern void sub_8035658(void);
extern bool8 IsDoubleBattle(void);
extern u8 GetSubstituteSpriteDefault_Y(u8 bank);
extern u8 GetBankSpriteDefault_Y(u8 bank);
extern u8 sub_80A82E4(u8 bank);
extern void sub_806A068(u16 species, u8 bankIdentity);
extern void sub_806A12C(u16 backPicId, u8 bankIdentity);
extern u8 GetBankPosition(u8 bank, u8 caseId);
// this file's functions
static void CB2_ReshowBattleScreenAfterMenu(void);
static bool8 LoadBankSpriteGfx(u8 bank);
static void CreateBankSprite(u8 bank);
static bool8 LoadBattlerSpriteGfx(u8 bank);
static void CreateBattlerSprite(u8 bank);
static void CreateHealthboxSprite(u8 bank);
static void sub_80A95F4(void);
@@ -118,32 +103,32 @@ static void CB2_ReshowBattleScreenAfterMenu(void)
}
break;
case 7:
if (!LoadBankSpriteGfx(0))
if (!LoadBattlerSpriteGfx(0))
gBattleScripting.reshowMainState--;
break;
case 8:
if (!LoadBankSpriteGfx(1))
if (!LoadBattlerSpriteGfx(1))
gBattleScripting.reshowMainState--;
break;
case 9:
if (!LoadBankSpriteGfx(2))
if (!LoadBattlerSpriteGfx(2))
gBattleScripting.reshowMainState--;
break;
case 10:
if (!LoadBankSpriteGfx(3))
if (!LoadBattlerSpriteGfx(3))
gBattleScripting.reshowMainState--;
break;
case 11:
CreateBankSprite(0);
CreateBattlerSprite(0);
break;
case 12:
CreateBankSprite(1);
CreateBattlerSprite(1);
break;
case 13:
CreateBankSprite(2);
CreateBattlerSprite(2);
break;
case 14:
CreateBankSprite(3);
CreateBattlerSprite(3);
break;
case 15:
CreateHealthboxSprite(0);
@@ -164,18 +149,18 @@ static void CB2_ReshowBattleScreenAfterMenu(void)
LoadAndCreateEnemyShadowSprites();
opponentBank = GetBankByIdentity(IDENTITY_OPPONENT_MON1);
species = GetMonData(&gEnemyParty[gBattlePartyID[opponentBank]], MON_DATA_SPECIES);
SetBankEnemyShadowSpriteCallback(opponentBank, species);
opponentBank = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[opponentBank]], MON_DATA_SPECIES);
SetBattlerShadowSpriteCallback(opponentBank, species);
if (IsDoubleBattle())
{
opponentBank = GetBankByIdentity(IDENTITY_OPPONENT_MON2);
species = GetMonData(&gEnemyParty[gBattlePartyID[opponentBank]], MON_DATA_SPECIES);
SetBankEnemyShadowSpriteCallback(opponentBank, species);
opponentBank = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[opponentBank]], MON_DATA_SPECIES);
SetBattlerShadowSpriteCallback(opponentBank, species);
}
ActionSelectionCreateCursorAt(gActionSelectionCursor[gBankInMenu], 0);
ActionSelectionCreateCursorAt(gActionSelectionCursor[gBattlerInMenuId], 0);
if (gWirelessCommType != 0 && gReceivedRemoteLinkPlayers != 0)
{
@@ -208,25 +193,25 @@ static void sub_80A95F4(void)
regBgcnt2->charBaseBlock = 0;
}
static bool8 LoadBankSpriteGfx(u8 bank)
static bool8 LoadBattlerSpriteGfx(u8 battler)
{
if (bank < gNoOfAllBanks)
if (battler < gBattlersCount)
{
if (GetBankSide(bank) != SIDE_PLAYER)
if (GetBattlerSide(battler) != B_SIDE_PLAYER)
{
if (!gBattleSpritesDataPtr->bankData[bank].behindSubstitute)
BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlePartyID[bank]], bank);
if (!gBattleSpritesDataPtr->battlerData[battler].behindSubstitute)
BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battler]], battler);
else
BattleLoadSubstituteOrMonSpriteGfx(bank, FALSE);
BattleLoadSubstituteOrMonSpriteGfx(battler, FALSE);
}
else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && bank == 0)
DecompressTrainerBackPic(gSaveBlock2Ptr->playerGender, bank);
else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && bank == 0)
DecompressTrainerBackPic(BACK_PIC_WALLY, bank);
else if (!gBattleSpritesDataPtr->bankData[bank].behindSubstitute)
BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlePartyID[bank]], bank);
else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && battler == 0)
DecompressTrainerBackPic(gSaveBlock2Ptr->playerGender, battler);
else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && battler == 0)
DecompressTrainerBackPic(BACK_PIC_WALLY, battler);
else if (!gBattleSpritesDataPtr->battlerData[battler].behindSubstitute)
BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battler]], battler);
else
BattleLoadSubstituteOrMonSpriteGfx(bank, FALSE);
BattleLoadSubstituteOrMonSpriteGfx(battler, FALSE);
gBattleScripting.reshowHelperState = 0;
}
@@ -243,111 +228,111 @@ struct MonCoords
};
extern const struct MonCoords gTrainerBackPicCoords[];
static void CreateBankSprite(u8 bank)
static void CreateBattlerSprite(u8 battler)
{
if (bank < gNoOfAllBanks)
if (battler < gBattlersCount)
{
u8 posY;
if (gBattleSpritesDataPtr->bankData[bank].behindSubstitute)
posY = GetSubstituteSpriteDefault_Y(bank);
if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute)
posY = GetSubstituteSpriteDefault_Y(battler);
else
posY = GetBankSpriteDefault_Y(bank);
posY = GetBattlerSpriteDefault_Y(battler);
if (GetBankSide(bank) != SIDE_PLAYER)
if (GetBattlerSide(battler) != B_SIDE_PLAYER)
{
if (GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_HP) == 0)
if (GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_HP) == 0)
return;
sub_806A068(GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES), GetBankIdentity(bank));
gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C, GetBankPosition(bank, 2), posY, sub_80A82E4(bank));
gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank;
gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy;
gSprites[gBankSpriteIds[bank]].data[0] = bank;
gSprites[gBankSpriteIds[bank]].data[2] = GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES);
sub_806A068(GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES), GetBattlerPosition(battler));
gBattlerSpriteIds[battler] = CreateSprite(&gUnknown_0202499C, GetBattlerSpriteCoord(battler, 2), posY, sub_80A82E4(battler));
gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler;
gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy;
gSprites[gBattlerSpriteIds[battler]].data[0] = battler;
gSprites[gBattlerSpriteIds[battler]].data[2] = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES);
StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]);
if (gBattleSpritesDataPtr->bankData[bank].transformSpecies == SPECIES_CASTFORM)
gSprites[gBankSpriteIds[bank]].anims = gMonAnimationsSpriteAnimsPtrTable[SPECIES_CASTFORM];
StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], gBattleMonForms[battler]);
if (gBattleSpritesDataPtr->battlerData[battler].transformSpecies == SPECIES_CASTFORM)
gSprites[gBattlerSpriteIds[battler]].anims = gMonAnimationsSpriteAnimsPtrTable[SPECIES_CASTFORM];
}
else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && bank == 0)
else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && battler == 0)
{
sub_806A12C(gSaveBlock2Ptr->playerGender, GetBankIdentity(IDENTITY_PLAYER_MON1));
gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C, 0x50,
sub_806A12C(gSaveBlock2Ptr->playerGender, GetBattlerPosition(B_POSITION_PLAYER_LEFT));
gBattlerSpriteIds[battler] = CreateSprite(&gUnknown_0202499C, 0x50,
(8 - gTrainerBackPicCoords[gSaveBlock2Ptr->playerGender].coords) * 4 + 80,
sub_80A82E4(0));
gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank;
gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy;
gSprites[gBankSpriteIds[bank]].data[0] = bank;
gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler;
gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy;
gSprites[gBattlerSpriteIds[battler]].data[0] = battler;
}
else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && bank == 0)
else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && battler == 0)
{
sub_806A12C(BACK_PIC_WALLY, GetBankIdentity(0));
gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C, 0x50,
sub_806A12C(BACK_PIC_WALLY, GetBattlerPosition(0));
gBattlerSpriteIds[battler] = CreateSprite(&gUnknown_0202499C, 0x50,
(8 - gTrainerBackPicCoords[BACK_PIC_WALLY].coords) * 4 + 80,
sub_80A82E4(0));
gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank;
gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy;
gSprites[gBankSpriteIds[bank]].data[0] = bank;
gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler;
gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy;
gSprites[gBattlerSpriteIds[battler]].data[0] = battler;
}
else
{
if (GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_HP) == 0)
if (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_HP) == 0)
return;
sub_806A068(GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES), GetBankIdentity(bank));
gBankSpriteIds[bank] = CreateSprite(&gUnknown_0202499C, GetBankPosition(bank, 2), posY, sub_80A82E4(bank));
gSprites[gBankSpriteIds[bank]].oam.paletteNum = bank;
gSprites[gBankSpriteIds[bank]].callback = SpriteCallbackDummy;
gSprites[gBankSpriteIds[bank]].data[0] = bank;
gSprites[gBankSpriteIds[bank]].data[2] = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES);
sub_806A068(GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES), GetBattlerPosition(battler));
gBattlerSpriteIds[battler] = CreateSprite(&gUnknown_0202499C, GetBattlerSpriteCoord(battler, 2), posY, sub_80A82E4(battler));
gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler;
gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy;
gSprites[gBattlerSpriteIds[battler]].data[0] = battler;
gSprites[gBattlerSpriteIds[battler]].data[2] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES);
StartSpriteAnim(&gSprites[gBankSpriteIds[bank]], gBattleMonForms[bank]);
if (gBattleSpritesDataPtr->bankData[bank].transformSpecies == SPECIES_CASTFORM)
gSprites[gBankSpriteIds[bank]].anims = gMonAnimationsSpriteAnimsPtrTable[SPECIES_CASTFORM];
StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], gBattleMonForms[battler]);
if (gBattleSpritesDataPtr->battlerData[battler].transformSpecies == SPECIES_CASTFORM)
gSprites[gBattlerSpriteIds[battler]].anims = gMonAnimationsSpriteAnimsPtrTable[SPECIES_CASTFORM];
}
gSprites[gBankSpriteIds[bank]].invisible = gBattleSpritesDataPtr->bankData[bank].invisible;
gSprites[gBattlerSpriteIds[battler]].invisible = gBattleSpritesDataPtr->battlerData[battler].invisible;
}
}
static void CreateHealthboxSprite(u8 bank)
static void CreateHealthboxSprite(u8 battler)
{
if (bank < gNoOfAllBanks)
if (battler < gBattlersCount)
{
u8 healthboxSpriteId;
if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && bank == 0)
if (gBattleTypeFlags & BATTLE_TYPE_SAFARI && battler == 0)
healthboxSpriteId = CreateSafariPlayerHealthboxSprites();
else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && bank == 0)
else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL && battler == 0)
return;
else
healthboxSpriteId = CreateBankHealthboxSprites(bank);
healthboxSpriteId = CreateBattlerHealthboxSprites(battler);
gHealthBoxesIds[bank] = healthboxSpriteId;
SetBankHealthboxSpritePos(bank);
gHealthboxSpriteIds[battler] = healthboxSpriteId;
InitBattlerHealthboxCoords(battler);
SetHealthboxSpriteVisible(healthboxSpriteId);
if (GetBankSide(bank) != SIDE_PLAYER)
UpdateHealthboxAttribute(gHealthBoxesIds[bank], &gEnemyParty[gBattlePartyID[bank]], HEALTHBOX_ALL);
if (GetBattlerSide(battler) != B_SIDE_PLAYER)
UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], &gEnemyParty[gBattlerPartyIndexes[battler]], HEALTHBOX_ALL);
else if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
UpdateHealthboxAttribute(gHealthBoxesIds[bank], &gPlayerParty[gBattlePartyID[bank]], HEALTHBOX_SAFARI_ALL_TEXT);
UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], &gPlayerParty[gBattlerPartyIndexes[battler]], HEALTHBOX_SAFARI_ALL_TEXT);
else
UpdateHealthboxAttribute(gHealthBoxesIds[bank], &gPlayerParty[gBattlePartyID[bank]], HEALTHBOX_ALL);
UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], &gPlayerParty[gBattlerPartyIndexes[battler]], HEALTHBOX_ALL);
if (GetBankIdentity(bank) == IDENTITY_OPPONENT_MON2 || GetBankIdentity(bank) == IDENTITY_PLAYER_MON2)
DummyBattleInterfaceFunc(gHealthBoxesIds[bank], TRUE);
if (GetBattlerPosition(battler) == B_POSITION_OPPONENT_RIGHT || GetBattlerPosition(battler) == B_POSITION_PLAYER_RIGHT)
DummyBattleInterfaceFunc(gHealthboxSpriteIds[battler], TRUE);
else
DummyBattleInterfaceFunc(gHealthBoxesIds[bank], FALSE);
DummyBattleInterfaceFunc(gHealthboxSpriteIds[battler], FALSE);
if (GetBankSide(bank) != SIDE_PLAYER)
if (GetBattlerSide(battler) != B_SIDE_PLAYER)
{
if (GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_HP) == 0)
if (GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_HP) == 0)
SetHealthboxSpriteInvisible(healthboxSpriteId);
}
else if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI))
{
if (GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_HP) == 0)
if (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_HP) == 0)
SetHealthboxSpriteInvisible(healthboxSpriteId);
}
}
+3 -3
View File
@@ -108,20 +108,20 @@ void SafariZoneRetirePrompt(void)
void CB2_EndSafariBattle(void)
{
sSafariZoneFleedMons += gBattleResults.field_1F;
if (gBattleOutcome == BATTLE_CAUGHT)
if (gBattleOutcome == B_OUTCOME_CAUGHT)
sSafariZoneCaughtMons++;
if (gNumSafariBalls != 0)
{
SetMainCallback2(c2_exit_to_overworld_2_switch);
}
else if (gBattleOutcome == BATTLE_SAFARI_OUT_OF_BALLS)
else if (gBattleOutcome == B_OUTCOME_NO_SAFARI_BALLS)
{
ScriptContext2_RunNewScript(EventScript_2A4B4C);
warp_in();
gFieldCallback = sub_80AF6F0;
SetMainCallback2(c2_load_new_map);
}
else if (gBattleOutcome == BATTLE_CAUGHT)
else if (gBattleOutcome == B_OUTCOME_CAUGHT)
{
ScriptContext1_SetupScript(EventScript_2A4B9B);
ScriptContext1_Stop();
+5 -5
View File
@@ -168,12 +168,12 @@ static bool8 WipeSectors(u32);
// although this is a general text printer, it's only used in this file.
static void SaveFailedScreenTextPrint(u8 *text, u8 var1, u8 var2)
{
struct TextColor color;
u8 color[3];
color.fgColor = 0;
color.bgColor = 15;
color.shadowColor = 3;
AddTextPrinterParameterized2(gSaveFailedWindowIds[TEXT_WIN_ID], 1, var1 * 8, var2 * 8 + 1, 0, 0, &color, 0, text);
color[0] = 0;
color[1] = 15;
color[2] = 3;
AddTextPrinterParameterized2(gSaveFailedWindowIds[TEXT_WIN_ID], 1, var1 * 8, var2 * 8 + 1, 0, 0, color, 0, text);
}
void DoSaveFailedScreen(u8 saveType)
+3 -11
View File
@@ -29,7 +29,6 @@
#include "menu.h"
#include "money.h"
#include "mystery_event_script.h"
#include "new_menu_helpers.h"
#include "palette.h"
#include "party_menu.h"
#include "pokemon_3.h"
@@ -64,13 +63,6 @@ static EWRAM_DATA u16 sMovingNpcMapBank = 0;
static EWRAM_DATA u16 sMovingNpcMapId = 0;
static EWRAM_DATA u16 sFieldEffectScriptId = 0;
extern u16 gSpecialVar_0x8000;
extern u16 gSpecialVar_0x8001;
extern u16 gSpecialVar_0x8002;
extern u16 gSpecialVar_0x8004;
extern u16 gSpecialVar_Result;
extern u16 gSpecialVar_ContestCategory;
IWRAM_DATA u8 gUnknown_03000F30;
@@ -1313,7 +1305,7 @@ bool8 ScrCmd_cmdDB(struct ScriptContext *ctx)
if (msg == NULL)
msg = (const u8 *)ctx->data[0];
sub_81973A4();
sub_81973C4(0, 1);
NewMenuHelpers_DrawDialogueFrame(0, 1);
PrintTextOnWindow(0, 1, msg, 0, 1, 0, 0);
return FALSE;
}
@@ -1530,7 +1522,7 @@ bool8 ScrCmd_braillemessage(struct ScriptContext *ctx)
template2 = template1;
gUnknown_03000F30 = AddWindow(&template2);
sub_809882C(gUnknown_03000F30, 0x214, 0xE0);
sub_81973FC(gUnknown_03000F30, 0);
NewMenuHelpers_DrawStdWindowFrame(gUnknown_03000F30, 0);
PutWindowTilemap(gUnknown_03000F30);
FillWindowPixelBuffer(gUnknown_03000F30, 0x11);
PrintTextOnWindow(gUnknown_03000F30, 6, gStringVar4, temp1, temp2, 0xFF, 0x0);
@@ -1651,7 +1643,7 @@ _0809AEC6:\n\
bl sub_809882C\n\
ldrb r0, [r5]\n\
mov r1, #0\n\
bl sub_81973FC\n\
bl NewMenuHelpers_DrawStdWindowFrame\n\
ldrb r0, [r5]\n\
bl PutWindowTilemap\n\
ldrb r0, [r5]\n\
+22 -214
View File
@@ -9,10 +9,10 @@
#include "window.h"
#include "menu.h"
#include "menu_helpers.h"
#include "new_menu_helpers.h"
#include "menu_indicators.h"
#include "constants/maps.h"
#include "constants/songs.h"
#include "constants/species.h"
#include "sound.h"
#include "overworld.h"
#include "fieldmap.h"
@@ -32,6 +32,7 @@
#include "international_string_util.h"
#include "event_data.h"
#include "battle.h"
#include "battle_setup.h"
#include "rom6.h"
#include "decoration.h"
#include "link.h"
@@ -711,237 +712,45 @@ u8 sub_80E98AC(struct Pokemon *pokemon)
return evTotal / 6;
}
#ifdef NONMATCHING
// This function is a meme
void sub_80E9914(void)
{
u32 zero;
u32 *personality;
u16 partyIdx;
u16 moveIdx;
u16 sbPartyIdx;
u16 *species;
u16 *items;
u16 *moves;
u8 *levels;
u8 *evs;
struct SecretBaseParty *party;
sbPartyIdx = 0;
personality = gSaveBlock1Ptr->secretBases[0].partyPersonality;
party = &gSaveBlock1Ptr->secretBases[0].party;
if (gSaveBlock1Ptr->secretBases[0].secretBaseId != 0)
{
partyIdx = 0;
moves = gSaveBlock1Ptr->secretBases[0].partyMoves;
species = gSaveBlock1Ptr->secretBases[0].partySpecies;
items = gSaveBlock1Ptr->secretBases[0].partyHeldItems;
levels = gSaveBlock1Ptr->secretBases[0].partyLevels;
evs = gSaveBlock1Ptr->secretBases[0].partyEVs;
zero = 0;
for (partyIdx = 0; partyIdx < PARTY_SIZE; partyIdx ++)
for (partyIdx = 0; partyIdx < PARTY_SIZE; partyIdx++)
{
for (moveIdx = 0; moveIdx < 4; moveIdx ++)
for (moveIdx = 0; moveIdx < 4; moveIdx++)
{
moves[partyIdx * 4 + moveIdx] = zero;
party->moves[partyIdx * 4 + moveIdx] = 0;
}
species[partyIdx] = zero;
items[partyIdx] = zero;
levels[partyIdx] = zero;
personality[partyIdx] = zero;
evs[partyIdx] = zero;
if (GetMonData(&gPlayerParty[partyIdx], MON_DATA_SPECIES) != SPECIES_NONE && !GetMonData(&gPlayerParty[partyIdx], MON_DATA_IS_EGG))
party->species[partyIdx] = 0;
party->heldItems[partyIdx] = 0;
party->levels[partyIdx] = 0;
party->personality[partyIdx] = 0;
party->EVs[partyIdx] = 0;
if (GetMonData(&gPlayerParty[partyIdx], MON_DATA_SPECIES) != SPECIES_NONE
&& !GetMonData(&gPlayerParty[partyIdx], MON_DATA_IS_EGG))
{
for (moveIdx = 0; moveIdx < 4; moveIdx ++)
for (moveIdx = 0; moveIdx < 4; moveIdx++)
{
moves[sbPartyIdx * 4 + moveIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_MOVE1 + moveIdx);
party->moves[sbPartyIdx * 4 + moveIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_MOVE1 + moveIdx);
}
species[sbPartyIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_SPECIES);
items[sbPartyIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_HELD_ITEM);
levels[sbPartyIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_LEVEL);
personality[sbPartyIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_PERSONALITY);
evs[sbPartyIdx] = sub_80E98AC(&gPlayerParty[partyIdx]);
sbPartyIdx ++;
party->species[sbPartyIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_SPECIES);
party->heldItems[sbPartyIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_HELD_ITEM);
party->levels[sbPartyIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_LEVEL);
party->personality[sbPartyIdx] = GetMonData(&gPlayerParty[partyIdx], MON_DATA_PERSONALITY);
party->EVs[sbPartyIdx] = sub_80E98AC(&gPlayerParty[partyIdx]);
sbPartyIdx++;
}
}
}
}
#else
ASM_DIRECT void sub_80E9914(void)
{
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, 0x24\n"
"\tmovs r0, 0\n"
"\tmov r10, r0\n"
"\tldr r0, =gSaveBlock1Ptr\n"
"\tldr r1, [r0]\n"
"\tldr r2, =0x00001ad0\n"
"\tadds r2, r1, r2\n"
"\tstr r2, [sp]\n"
"\tldr r3, =0x00001a9c\n"
"\tadds r0, r1, r3\n"
"\tldrb r0, [r0]\n"
"\tcmp r0, 0\n"
"\tbne _080E993A\n"
"\tb _080E9A60\n"
"_080E993A:\n"
"\tmovs r6, 0\n"
"\tldr r7, =0x00001ae8\n"
"\tadds r7, r1, r7\n"
"\tstr r7, [sp, 0x14]\n"
"\tldr r0, =0x00001b18\n"
"\tadds r0, r1, r0\n"
"\tstr r0, [sp, 0xC]\n"
"\tldr r2, =0x00001b24\n"
"\tadds r2, r1, r2\n"
"\tstr r2, [sp, 0x10]\n"
"\tadds r3, 0x94\n"
"\tadds r3, r1, r3\n"
"\tstr r3, [sp, 0x18]\n"
"\tldr r7, =0x00001b36\n"
"\tadds r7, r1, r7\n"
"\tstr r7, [sp, 0x1C]\n"
"\tmov r9, r6\n"
"_080E995C:\n"
"\tmovs r4, 0\n"
"\tlsls r5, r6, 2\n"
"\tlsls r3, r6, 1\n"
"\tldr r0, =gPlayerParty\n"
"\tmov r8, r0\n"
"\tadds r1, r6, 0x1\n"
"\tstr r1, [sp, 0x4]\n"
"\tadds r2, r5, 0\n"
"\tldr r1, [sp, 0x14]\n"
"_080E996E:\n"
"\tadds r0, r2, r4\n"
"\tlsls r0, 1\n"
"\tadds r0, r1, r0\n"
"\tmov r7, r9\n"
"\tstrh r7, [r0]\n"
"\tadds r0, r4, 0x1\n"
"\tlsls r0, 16\n"
"\tlsrs r4, r0, 16\n"
"\tcmp r4, 0x3\n"
"\tbls _080E996E\n"
"\tldr r1, [sp, 0xC]\n"
"\tadds r0, r1, r3\n"
"\tmov r2, r9\n"
"\tstrh r2, [r0]\n"
"\tldr r7, [sp, 0x10]\n"
"\tadds r0, r7, r3\n"
"\tstrh r2, [r0]\n"
"\tldr r1, [sp, 0x18]\n"
"\tadds r0, r1, r6\n"
"\tmov r2, r9\n"
"\tstrb r2, [r0]\n"
"\tldr r3, [sp]\n"
"\tadds r0, r3, r5\n"
"\tmov r7, r9\n"
"\tstr r7, [r0]\n"
"\tldr r1, [sp, 0x1C]\n"
"\tadds r0, r1, r6\n"
"\tstrb r7, [r0]\n"
"\tmovs r2, 0x64\n"
"\tadds r5, r6, 0\n"
"\tmuls r5, r2\n"
"\tmov r3, r8\n"
"\tadds r4, r5, r3\n"
"\tadds r0, r4, 0\n"
"\tmovs r1, 0xB\n"
"\tbl GetMonData\n"
"\tcmp r0, 0\n"
"\tbeq _080E9A54\n"
"\tadds r0, r4, 0\n"
"\tmovs r1, 0x2D\n"
"\tbl GetMonData\n"
"\tcmp r0, 0\n"
"\tbne _080E9A54\n"
"\tmovs r4, 0\n"
"\tmov r7, r10\n"
"\tlsls r7, 2\n"
"\tmov r8, r7\n"
"\tmov r0, r10\n"
"\tlsls r7, r0, 1\n"
"\tadds r0, 0x1\n"
"\tstr r0, [sp, 0x8]\n"
"\tldr r2, =gPlayerParty\n"
"_080E99DA:\n"
"\tadds r1, r4, 0\n"
"\tadds r1, 0xD\n"
"\tadds r0, r5, r2\n"
"\tstr r2, [sp, 0x20]\n"
"\tbl GetMonData\n"
"\tmov r3, r8\n"
"\tadds r1, r3, r4\n"
"\tlsls r1, 1\n"
"\tldr r3, [sp, 0x14]\n"
"\tadds r1, r3, r1\n"
"\tstrh r0, [r1]\n"
"\tadds r0, r4, 0x1\n"
"\tlsls r0, 16\n"
"\tlsrs r4, r0, 16\n"
"\tldr r2, [sp, 0x20]\n"
"\tcmp r4, 0x3\n"
"\tbls _080E99DA\n"
"\tmovs r0, 0x64\n"
"\tadds r4, r6, 0\n"
"\tmuls r4, r0\n"
"\tldr r0, =gPlayerParty\n"
"\tadds r4, r0\n"
"\tadds r0, r4, 0\n"
"\tmovs r1, 0xB\n"
"\tbl GetMonData\n"
"\tldr r2, [sp, 0xC]\n"
"\tadds r1, r2, r7\n"
"\tstrh r0, [r1]\n"
"\tadds r0, r4, 0\n"
"\tmovs r1, 0xC\n"
"\tbl GetMonData\n"
"\tldr r3, [sp, 0x10]\n"
"\tadds r1, r3, r7\n"
"\tstrh r0, [r1]\n"
"\tadds r0, r4, 0\n"
"\tmovs r1, 0x38\n"
"\tbl GetMonData\n"
"\tldr r1, [sp, 0x18]\n"
"\tadd r1, r10\n"
"\tstrb r0, [r1]\n"
"\tadds r0, r4, 0\n"
"\tmovs r1, 0\n"
"\tbl GetMonData\n"
"\tldr r1, [sp]\n"
"\tadd r1, r8\n"
"\tstr r0, [r1]\n"
"\tadds r0, r4, 0\n"
"\tbl sub_80E98AC\n"
"\tldr r1, [sp, 0x1C]\n"
"\tadd r1, r10\n"
"\tstrb r0, [r1]\n"
"\tldr r7, [sp, 0x8]\n"
"\tlsls r0, r7, 16\n"
"\tlsrs r0, 16\n"
"\tmov r10, r0\n"
"_080E9A54:\n"
"\tldr r1, [sp, 0x4]\n"
"\tlsls r0, r1, 16\n"
"\tlsrs r6, r0, 16\n"
"\tcmp r6, 0x5\n"
"\tbhi _080E9A60\n"
"\tb _080E995C\n"
"_080E9A60:\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 {r0}\n"
"\tbx r0\n"
"\t.pool");
}
#endif
void sub_80E9A90(void)
{
@@ -1357,7 +1166,6 @@ void sub_80EA354(void)
gSpecialVar_Result = gSaveBlock1Ptr->secretBases[secretBaseRecordId].sbr_field_1_5;
}
void sub_80EA3E4(u8 taskId)
{
s16 x;
+24 -90
View File
@@ -240,12 +240,26 @@ static const AffineAnimCmdFunc sAffineAnimCmdFuncs[] =
AffineAnimCmd_frame,
};
static const s32 sUnknown_082EC6F4[24] =
static const s32 sUnknown_082EC6F4[3][4][2] =
{
8, 8, 0x10, 0x10, 0x20, 0x20,
0x40, 0x40, 0x10, 8, 0x20, 8,
0x20, 0x10, 0x40, 0x20, 8, 0x10,
8, 0x20, 0x10, 0x20, 0x20, 0x40,
{
{8, 8},
{0x10, 0x10},
{0x20, 0x20},
{0x40, 0x40},
},
{
{0x10, 8},
{0x20, 8},
{0x20, 0x10},
{0x40, 0x20},
},
{
{8, 0x10},
{8, 0x20},
{0x10, 0x20},
{0x20, 0x40},
},
};
static const struct OamDimensions sOamDimensions[3][4] =
@@ -1207,106 +1221,26 @@ s32 sub_8007E28(s32 a0, s32 a1, s32 a2)
return a2 - ((u32)(a2 * a1) / (u32)(a0) + var1);
}
#ifdef NONMATCHING
void obj_update_pos2(struct Sprite* sprite, s32 a1, s32 a2)
void obj_update_pos2(struct Sprite *sprite, s32 a1, s32 a2)
{
s32 var0, var1, var2;
u8 matrixNum = sprite->oam.matrixNum;
u32 matrixNum = sprite->oam.matrixNum;
if (a1 != 0x800)
{
var0 = sUnknown_082EC6F4[sprite->oam.size * 8 + sprite->oam.shape * 32];
var0 = sUnknown_082EC6F4[sprite->oam.shape][sprite->oam.size][0];
var1 = var0 << 8;
var2 = (var0 << 16) / gOamMatrices[matrixNum].a;
sprite->pos2.x = sub_8007E28(var1, var2, a1);
}
if (a2 != 0x800)
{
var0 = sUnknown_082EC6F4[4 + (sprite->oam.size * 8 + sprite->oam.shape * 32)];
var0 = sUnknown_082EC6F4[sprite->oam.shape][sprite->oam.size][1];
var1 = var0 << 8;
var2 = (var0 << 16) / gOamMatrices[matrixNum].d;
sprite->pos2.y = sub_8007E28(var1, var2, a2);
}
}
#else
ASM_DIRECT
void obj_update_pos2(struct Sprite* sprite, s32 a1, s32 a2)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
mov r7, r9\n\
mov r6, r8\n\
push {r6,r7}\n\
adds r5, r0, 0\n\
adds r6, r1, 0\n\
mov r8, r2\n\
ldrb r1, [r5, 0x3]\n\
lsls r0, r1, 26\n\
lsrs r7, r0, 27\n\
movs r0, 0x80\n\
lsls r0, 4\n\
mov r9, r0\n\
cmp r6, r9\n\
beq _08007EA2\n\
ldr r2, =sUnknown_082EC6F4\n\
lsrs r1, 6\n\
lsls r1, 3\n\
ldrb r0, [r5, 0x1]\n\
lsrs r0, 6\n\
lsls r0, 5\n\
adds r1, r0\n\
adds r1, r2\n\
ldr r0, [r1]\n\
lsls r4, r0, 8\n\
lsls r0, 16\n\
ldr r2, =gOamMatrices\n\
lsls r1, r7, 3\n\
adds r1, r2\n\
movs r2, 0\n\
ldrsh r1, [r1, r2]\n\
bl __divsi3\n\
adds r1, r0, 0\n\
adds r0, r4, 0\n\
adds r2, r6, 0\n\
bl sub_8007E28\n\
strh r0, [r5, 0x24]\n\
_08007EA2:\n\
cmp r8, r9\n\
beq _08007EDA\n\
ldr r2, =sUnknown_082EC6F4\n\
ldrb r1, [r5, 0x3]\n\
lsrs r1, 6\n\
lsls r1, 3\n\
ldrb r0, [r5, 0x1]\n\
lsrs r0, 6\n\
lsls r0, 5\n\
adds r1, r0\n\
adds r2, 0x4\n\
adds r1, r2\n\
ldr r0, [r1]\n\
lsls r4, r0, 8\n\
lsls r0, 16\n\
ldr r2, =gOamMatrices\n\
lsls r1, r7, 3\n\
adds r1, r2\n\
movs r2, 0x6\n\
ldrsh r1, [r1, r2]\n\
bl __divsi3\n\
adds r1, r0, 0\n\
adds r0, r4, 0\n\
mov r2, r8\n\
bl sub_8007E28\n\
strh r0, [r5, 0x26]\n\
_08007EDA:\n\
pop {r3,r4}\n\
mov r8, r3\n\
mov r9, r4\n\
pop {r4-r7}\n\
pop {r0}\n\
bx r0\n\
.pool\n\
.syntax divided");
}
#endif // NONMATCHING
void SetSpriteOamFlipBits(struct Sprite *sprite, u8 hFlip, u8 vFlip)
{
+15 -3
View File
@@ -32,7 +32,7 @@ extern bool32 InUnionRoom(void);
extern bool8 InBattlePike(void);
extern bool8 InBattlePyramid(void);
extern bool8 InMultiBattleRoom(void);
extern void sub_81973FC(u8 windowId, u8 a1);
extern void NewMenuHelpers_DrawStdWindowFrame(u8 windowId, u8 a1);
extern void sub_8198070(u8 windowId, u8 a1);
// this file's functions
@@ -62,6 +62,11 @@ EWRAM_DATA u8 sBattlePyramidFloorWindowId = 0;
EWRAM_DATA u8 sStartMenuCursorPos = 0;
EWRAM_DATA u8 sNumStartMenuActions = 0;
EWRAM_DATA u8 sCurrentStartMenuActions[9] = {0};
EWRAM_DATA u8 gUnknown_02037619[2] = {0};
EWRAM_DATA bool8 (*gUnknown_0203761C)(void) = NULL;
EWRAM_DATA u8 gUnknown_02037620 = 0;
EWRAM_DATA u8 gUnknown_02037621 = 0;
EWRAM_DATA u8 gUnknown_02037622 = 0;
// const rom data
static const struct WindowTemplate gSafariBallsWindowTemplate = {0, 1, 1, 9, 4, 0xF, 8};
@@ -120,6 +125,13 @@ const struct WindowTemplate gUnknown_085105AC[] =
const struct WindowTemplate gUnknown_085105BC = {0, 1, 1, 0xE, 0xA, 0xF, 8};
// code
void SetDexPokemonPokenavFlags(void) // unused
{
FlagSet(FLAG_SYS_POKEDEX_GET);
FlagSet(FLAG_SYS_POKEMON_GET);
FlagSet(FLAG_SYS_POKENAV_GET);
}
void BuildStartMenuActions(void)
{
sNumStartMenuActions = 0;
@@ -224,7 +236,7 @@ void DisplaySafariBallsWindow(void)
{
sSafariBallsWindowId = AddWindow(&gSafariBallsWindowTemplate);
PutWindowTilemap(sSafariBallsWindowId);
sub_81973FC(sSafariBallsWindowId, 0);
NewMenuHelpers_DrawStdWindowFrame(sSafariBallsWindowId, 0);
ConvertIntToDecimalStringN(gStringVar1, gNumSafariBalls, STR_CONV_MODE_RIGHT_ALIGN, 2);
StringExpandPlaceholders(gStringVar4, gText_SafariBallStock);
PrintTextOnWindow(sSafariBallsWindowId, 1, gStringVar4, 0, 1, 0xFF, NULL);
@@ -239,7 +251,7 @@ void DisplayPyramidFloorWindow(void)
else
sBattlePyramidFloorWindowId = AddWindow(&gPyramidFloorWindowTemplate_2);
PutWindowTilemap(sBattlePyramidFloorWindowId);
sub_81973FC(sBattlePyramidFloorWindowId, 0);
NewMenuHelpers_DrawStdWindowFrame(sBattlePyramidFloorWindowId, 0);
StringCopy(gStringVar1, sPyramindFloorNames[gSaveBlock2Ptr->field_CAA[4]]);
StringExpandPlaceholders(gStringVar4, gText_BattlePyramidFloor);
PrintTextOnWindow(sBattlePyramidFloorWindowId, 1, gStringVar4, 0, 1, 0xFF, NULL);
+3 -3
View File
@@ -164,7 +164,7 @@ u16 PrintTextOnWindow(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 spee
subPrinter.letterSpacing = gFonts[fontId].letterSpacing;
subPrinter.lineSpacing = gFonts[fontId].lineSpacing;
subPrinter.fontColor_l = gFonts[fontId].fontColor_l;
subPrinter.fontColor_h = gFonts[fontId].fontColor_h;
subPrinter.fgColor = gFonts[fontId].fgColor;
subPrinter.bgColor = gFonts[fontId].bgColor;
subPrinter.shadowColor = gFonts[fontId].shadowColor;
return AddTextPrinter(&subPrinter, speed, callback);
@@ -194,7 +194,7 @@ bool16 AddTextPrinter(struct TextSubPrinter *textSubPrinter, u8 speed, void (*ca
gTempTextPrinter.minLetterSpacing = 0;
gTempTextPrinter.japanese = 0;
GenerateFontHalfRowLookupTable(textSubPrinter->fontColor_h, textSubPrinter->bgColor, textSubPrinter->shadowColor);
GenerateFontHalfRowLookupTable(textSubPrinter->fgColor, textSubPrinter->bgColor, textSubPrinter->shadowColor);
if (speed != TEXT_SPEED_FF && speed != 0x0)
{
--gTempTextPrinter.text_speed;
@@ -3517,7 +3517,7 @@ u8 GetFontAttribute(u8 fontId, u8 attributeId)
result = gFontInfos[fontId].fontColor_l;
break;
case 5:
result = gFontInfos[fontId].fontColor_h;
result = gFontInfos[fontId].fgColor;
break;
case 6:
result = gFontInfos[fontId].bgColor;
+783
View File
@@ -0,0 +1,783 @@
#include "global.h"
#include "title_screen.h"
#include "sprite.h"
#include "gba/m4a_internal.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 "berry_fix_program.h"
#include "sound.h"
#include "sprite.h"
#include "task.h"
#include "scanline_effect.h"
#include "gpu_regs.h"
#include "trig.h"
#include "constants/rgb.h"
#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 2
#define VERSION_BANNER_Y_GOAL 66
#define START_BANNER_X 128
#define CLEAR_SAVE_BUTTON_COMBO (B_BUTTON | SELECT_BUTTON | DPAD_UP)
#define RESET_RTC_BUTTON_COMBO (B_BUTTON | SELECT_BUTTON | DPAD_LEFT)
#define BERRY_UPDATE_BUTTON_COMBO (B_BUTTON | SELECT_BUTTON)
#define A_B_START_SELECT (A_BUTTON | B_BUTTON | START_BUTTON | SELECT_BUTTON)
extern struct MusicPlayerInfo gMPlayInfo_BGM;
extern u16 gBattle_BG1_X;
extern u16 gBattle_BG1_Y;
extern const u8 gTitleScreenEmeraldVersionGfx[];
extern const u8 gTitleScreenPressStartGfx[];
extern const u8 gTitleScreenPokemonLogoGfx[];
extern const u8 gUnknown_08DE0644[];
extern const u8 gUnknown_08DDE458[];
extern const u16 gTitleScreenBgPalettes[];
extern const u16 gTitleScreenPressStartPal[];
extern const u16 gTitleScreenEmeraldVersionPal[];
// this file's functions
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_GoToBerryFixScreen(void);
static void CB2_GoToCopyrightScreen(void);
static void UpdateLegendaryMarkingColor(u8);
static void SpriteCB_VersionBannerLeft(struct Sprite *sprite);
static void SpriteCB_VersionBannerRight(struct Sprite *sprite);
static void SpriteCB_PressStartCopyrightBanner(struct Sprite *sprite);
static void SpriteCB_PokemonLogoShine(struct Sprite *sprite);
// const rom data
static const u16 sUnusedUnknownPal[] = INCBIN_U16("graphics/title_screen/unk_853EF78.gbapal");
static const u8 sTitleScreenRayquazaGfx[] = INCBIN_U8("graphics/title_screen/rayquaza.4bpp.lz");
static const u8 sTitleScreenRayquazaTilemap[] = INCBIN_U8("graphics/title_screen/rayquaza.bin.lz");
static const u8 sTitleScreenLogoShineGfx[] = INCBIN_U8("graphics/title_screen/logo_shine.4bpp.lz");
static const u8 sTitleScreenCloudsGfx[] = INCBIN_U8("graphics/title_screen/clouds.4bpp.lz");
const u16 gUnknown_0853FF70[] =
{
0x0010, 0x0110, 0x0210, 0x0310, 0x0410, 0x0510, 0x0610, 0x0710,
0x0810, 0x0910, 0x0a10, 0x0b10, 0x0c10, 0x0d10, 0x0e10, 0x0f10,
0x100f, 0x100e, 0x100d, 0x100c, 0x100b, 0x100a, 0x1009, 0x1008,
0x1007, 0x1006, 0x1005, 0x1004, 0x1003, 0x1002, 0x1001, 0x1000,
0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 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 = SpriteCB_VersionBannerLeft,
};
static const struct SpriteTemplate sVersionBannerRightSpriteTemplate =
{
.tileTag = 1000,
.paletteTag = 1000,
.oam = &sVersionBannerRightOamData,
.anims = sVersionBannerRightAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCB_VersionBannerRight,
};
static const struct CompressedSpriteSheet sSpriteSheet_EmeraldVersion[] =
{
{gTitleScreenEmeraldVersionGfx, VERSION_BANNER_BYTES, 1000},
{NULL},
};
static const struct OamData sOamData_CopyrightBanner =
{
.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 sCopyrightBannerAnim0[] =
{
ANIMCMD_FRAME(1, 4),
ANIMCMD_END,
};
static const union AnimCmd sCopyrightBannerAnim1[] =
{
ANIMCMD_FRAME(5, 4),
ANIMCMD_END,
};
static const union AnimCmd sCopyrightBannerAnim2[] =
{
ANIMCMD_FRAME(9, 4),
ANIMCMD_END,
};
static const union AnimCmd sCopyrightBannerAnim3[] =
{
ANIMCMD_FRAME(13, 4),
ANIMCMD_END,
};
static const union AnimCmd sCopyrightBannerAnim4[] =
{
ANIMCMD_FRAME(17, 4),
ANIMCMD_END,
};
static const union AnimCmd sCopyrightBannerAnim5[] =
{
ANIMCMD_FRAME(21, 4),
ANIMCMD_END,
};
static const union AnimCmd sCopyrightBannerAnim6[] =
{
ANIMCMD_FRAME(25, 4),
ANIMCMD_END,
};
static const union AnimCmd sCopyrightBannerAnim7[] =
{
ANIMCMD_FRAME(29, 4),
ANIMCMD_END,
};
static const union AnimCmd sCopyrightBannerAnim8[] =
{
ANIMCMD_FRAME(33, 4),
ANIMCMD_END,
};
static const union AnimCmd sCopyrightBannerAnim9[] =
{
ANIMCMD_FRAME(37, 4),
ANIMCMD_END,
};
static const union AnimCmd *const sStartCopyrightBannerAnimTable[] =
{
sCopyrightBannerAnim0,
sCopyrightBannerAnim1,
sCopyrightBannerAnim2,
sCopyrightBannerAnim3,
sCopyrightBannerAnim4,
sCopyrightBannerAnim5,
sCopyrightBannerAnim6,
sCopyrightBannerAnim7,
sCopyrightBannerAnim8,
sCopyrightBannerAnim9,
};
static const struct SpriteTemplate sStartCopyrightBannerSpriteTemplate =
{
.tileTag = 1001,
.paletteTag = 1001,
.oam = &sOamData_CopyrightBanner,
.anims = sStartCopyrightBannerAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCB_PressStartCopyrightBanner,
};
static const struct CompressedSpriteSheet sSpriteSheet_PressStart[] =
{
{gTitleScreenPressStartGfx, 0x520, 1001},
{NULL},
};
static const struct SpritePalette sSpritePalette_PressStart[] =
{
{gTitleScreenPressStartPal, 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 = SpriteCB_PokemonLogoShine,
};
static const struct CompressedSpriteSheet sPokemonLogoShineSpriteSheet[] =
{
{sTitleScreenLogoShineGfx, 0x800, 1002},
{NULL},
};
// code
static void SpriteCB_VersionBannerLeft(struct Sprite *sprite)
{
if (gTasks[sprite->data[1]].data[1] != 0)
{
sprite->oam.objMode = 0;
sprite->pos1.y = VERSION_BANNER_Y_GOAL;
}
else
{
if (sprite->pos1.y != VERSION_BANNER_Y_GOAL)
sprite->pos1.y++;
if (sprite->data[0] != 0)
sprite->data[0]--;
SetGpuReg(REG_OFFSET_BLDALPHA, gUnknown_0853FF70[sprite->data[0]]);
}
}
static void SpriteCB_VersionBannerRight(struct Sprite *sprite)
{
if (gTasks[sprite->data[1]].data[1] != 0)
{
sprite->oam.objMode = 0;
sprite->pos1.y = VERSION_BANNER_Y_GOAL;
}
else
{
if (sprite->pos1.y != VERSION_BANNER_Y_GOAL)
sprite->pos1.y++;
}
}
static void SpriteCB_PressStartCopyrightBanner(struct Sprite *sprite)
{
if (sprite->data[0] == 1)
{
sprite->data[1]++;
// Alternate between hidden and shown every 16th frame
if (sprite->data[1] & 0x10)
sprite->invisible = FALSE;
else
sprite->invisible = TRUE;
}
else
{
sprite->invisible = FALSE;
}
}
static void CreatePressStartBanner(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);
gSprites[spriteId].data[0] = 1;
}
}
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 + 5);
}
}
static void SpriteCB_PokemonLogoShine(struct Sprite *sprite)
{
if (sprite->pos1.x < 272)
{
if (sprite->data[0]) // Flash background
{
u16 backgroundColor;
if (sprite->pos1.x < DISPLAY_WIDTH / 2)
{
// Brighten background color
if (sprite->data[1] < 31)
sprite->data[1]++;
if (sprite->data[1] < 31)
sprite->data[1]++;
}
else
{
// Darken background color
if (sprite->data[1] != 0)
sprite->data[1]--;
if (sprite->data[1] != 0)
sprite->data[1]--;
}
backgroundColor = _RGB(sprite->data[1], sprite->data[1], sprite->data[1]);
if (sprite->pos1.x == DISPLAY_WIDTH / 2 + 12
|| sprite->pos1.x == DISPLAY_WIDTH / 2 + 16
|| sprite->pos1.x == DISPLAY_WIDTH / 2 + 20
|| sprite->pos1.x == DISPLAY_WIDTH / 2 + 24)
gPlttBufferFaded[0] = RGB(24, 31, 12);
else
gPlttBufferFaded[0] = backgroundColor;
}
sprite->pos1.x += 4;
}
else
{
gPlttBufferFaded[0] = RGB_BLACK;
DestroySprite(sprite);
}
}
static void SpriteCB_PokemonLogoShine2(struct Sprite *sprite)
{
if (sprite->pos1.x < 272)
sprite->pos1.x += 8;
else
DestroySprite(sprite);
}
static void StartPokemonLogoShine(u8 flashBg)
{
u8 spriteId;
switch (flashBg)
{
case 0:
case 2:
spriteId = CreateSprite(&sPokemonLogoShineSpriteTemplate, 0, 68, 0);
gSprites[spriteId].oam.objMode = 2;
gSprites[spriteId].data[0] = flashBg;
break;
case 1:
spriteId = CreateSprite(&sPokemonLogoShineSpriteTemplate, 0, 68, 0);
gSprites[spriteId].oam.objMode = 2;
gSprites[spriteId].data[0] = flashBg;
gSprites[spriteId].invisible = TRUE;
spriteId = CreateSprite(&sPokemonLogoShineSpriteTemplate, 0, 68, 0);
gSprites[spriteId].callback = SpriteCB_PokemonLogoShine2;
gSprites[spriteId].oam.objMode = 2;
spriteId = CreateSprite(&sPokemonLogoShineSpriteTemplate, -80, 68, 0);
gSprites[spriteId].callback = SpriteCB_PokemonLogoShine2;
gSprites[spriteId].oam.objMode = 2;
break;
}
}
static void VBlankCB(void)
{
ScanlineEffect_InitHBlankDmaTransfer();
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y);
}
#define tCounter data[0]
#define tSkipToNext data[1]
void CB2_InitTitleScreen(void)
{
switch (gMain.state)
{
default:
case 0:
SetVBlankCallback(NULL);
SetGpuReg(REG_OFFSET_BLDCNT, 0);
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
SetGpuReg(REG_OFFSET_BLDY, 0);
*((u16 *)PLTT) = RGB_WHITE;
SetGpuReg(REG_OFFSET_DISPCNT, 0);
SetGpuReg(REG_OFFSET_BG2CNT, 0);
SetGpuReg(REG_OFFSET_BG1CNT, 0);
SetGpuReg(REG_OFFSET_BG0CNT, 0);
SetGpuReg(REG_OFFSET_BG2HOFS, 0);
SetGpuReg(REG_OFFSET_BG2VOFS, 0);
SetGpuReg(REG_OFFSET_BG1HOFS, 0);
SetGpuReg(REG_OFFSET_BG1VOFS, 0);
SetGpuReg(REG_OFFSET_BG0HOFS, 0);
SetGpuReg(REG_OFFSET_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();
gMain.state = 1;
break;
case 1:
LZ77UnCompVram(gTitleScreenPokemonLogoGfx, (void *)VRAM);
LZ77UnCompVram(gUnknown_08DE0644, (void *)(VRAM + 0x4800));
LoadPalette(gTitleScreenBgPalettes, 0, 0x1E0);
LZ77UnCompVram(sTitleScreenRayquazaGfx, (void *)(VRAM + 0x8000));
LZ77UnCompVram(sTitleScreenRayquazaTilemap, (void *)(VRAM + 0xD000));
LZ77UnCompVram(sTitleScreenCloudsGfx, (void *)(VRAM + 0xC000));
LZ77UnCompVram(gUnknown_08DDE458, (void *)(VRAM + 0xD800));
ScanlineEffect_Stop();
ResetTasks();
ResetSpriteData();
FreeAllSpritePalettes();
gReservedSpritePaletteCount = 9;
LoadCompressedObjectPic(&sSpriteSheet_EmeraldVersion[0]);
LoadCompressedObjectPic(&sSpriteSheet_PressStart[0]);
LoadCompressedObjectPic(&sPokemonLogoShineSpriteSheet[0]);
LoadPalette(gTitleScreenEmeraldVersionPal, 0x100, 0x20);
LoadSpritePalette(&sSpritePalette_PressStart[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;
gMain.state = 3;
break;
}
case 3:
BeginNormalPaletteFade(-1, 1, 0x10, 0, 0xFFFF);
SetVBlankCallback(VBlankCB);
gMain.state = 4;
break;
case 4:
sub_816F2A8(0x78, 0x50, 0x100, 0);
SetGpuReg(REG_OFFSET_BG2X_L, -29 * 256);
SetGpuReg(REG_OFFSET_BG2X_H, -1);
SetGpuReg(REG_OFFSET_BG2Y_L, -32 * 256);
SetGpuReg(REG_OFFSET_BG2Y_H, -1);
SetGpuReg(REG_OFFSET_WIN0H, 0);
SetGpuReg(REG_OFFSET_WIN0V, 0);
SetGpuReg(REG_OFFSET_WIN1H, 0);
SetGpuReg(REG_OFFSET_WIN1V, 0);
SetGpuReg(REG_OFFSET_WININ, 0x1F1F);
SetGpuReg(REG_OFFSET_WINOUT, 0x3F1F);
SetGpuReg(REG_OFFSET_BLDCNT, 0x84);
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
SetGpuReg(REG_OFFSET_BLDY, 0xC);
SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(2) | BGCNT_SCREENBASE(26) | BGCNT_16COLOR | BGCNT_TXT256x256);
SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(3) | BGCNT_SCREENBASE(27) | BGCNT_16COLOR | BGCNT_TXT256x256);
SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(1) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(9) | BGCNT_256COLOR | BGCNT_AFF256x256);
EnableInterrupts(INTR_FLAG_VBLANK);
SetGpuReg(REG_OFFSET_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(0);
ScanlineEffect_InitWave(0, DISPLAY_HEIGHT, 4, 4, 0, SCANLINE_EFFECT_REG_BG1HOFS, TRUE);
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 == 176)
StartPokemonLogoShine(1);
else if (frameNum == 64)
StartPokemonLogoShine(2);
gTasks[taskId].tCounter--;
}
else
{
u8 spriteId;
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON);
SetGpuReg(REG_OFFSET_WININ, 0);
SetGpuReg(REG_OFFSET_WINOUT, 0);
SetGpuReg(REG_OFFSET_BLDCNT, 0x3F50);
SetGpuReg(REG_OFFSET_BLDALPHA, 0x10);
SetGpuReg(REG_OFFSET_BLDY, 0);
// Create left side of version banner
spriteId = CreateSprite(&sVersionBannerLeftSpriteTemplate, VERSION_BANNER_LEFT_X, VERSION_BANNER_Y, 0);
gSprites[spriteId].data[0] = 64;
gSprites[spriteId].data[1] = taskId;
// Create right side of version banner
spriteId = CreateSprite(&sVersionBannerRightSpriteTemplate, VERSION_BANNER_RIGHT_X, VERSION_BANNER_Y, 0);
gSprites[spriteId].data[1] = taskId;
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)
{
u32 yPos;
// 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;
SetGpuReg(REG_OFFSET_BLDCNT, 0x2142);
SetGpuReg(REG_OFFSET_BLDALPHA, 0xF06);
SetGpuReg(REG_OFFSET_BLDY, 0);
SetGpuReg(REG_OFFSET_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(START_BANNER_X, 148);
gTasks[taskId].data[4] = 0;
gTasks[taskId].func = Task_TitleScreenPhase3;
}
if (!(gTasks[taskId].tCounter & 3) && gTasks[taskId].data[2] != 0)
gTasks[taskId].data[2]++;
if (!(gTasks[taskId].tCounter & 1) && gTasks[taskId].data[3] != 0)
gTasks[taskId].data[3]++;
// Slide Pokemon logo up
yPos = gTasks[taskId].data[3] * 256;
SetGpuReg(REG_OFFSET_BG2Y_L, yPos);
SetGpuReg(REG_OFFSET_BG2Y_H, yPos / 0x10000);
gTasks[taskId].data[5] = 15;
gTasks[taskId].data[6] = 6;
}
// Show Rayquaza silhouette and process main title screen input
static void Task_TitleScreenPhase3(u8 taskId)
{
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);
}
else if ((gMain.heldKeys & RESET_RTC_BUTTON_COMBO) == RESET_RTC_BUTTON_COMBO
&& CanResetRTC() == TRUE)
{
FadeOutBGM(4);
BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
SetMainCallback2(CB2_GoToResetRtcScreen);
}
else if ((gMain.heldKeys & BERRY_UPDATE_BUTTON_COMBO) == BERRY_UPDATE_BUTTON_COMBO)
{
FadeOutBGM(4);
BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
SetMainCallback2(CB2_GoToBerryFixScreen);
}
else
{
SetGpuReg(REG_OFFSET_BG2Y_L, 0);
SetGpuReg(REG_OFFSET_BG2Y_H, 0);
gTasks[taskId].tCounter++;
if (gTasks[taskId].tCounter & 1)
{
gTasks[taskId].data[4]++;
gBattle_BG1_Y = gTasks[taskId].data[4] / 2;
gBattle_BG1_X = 0;
}
UpdateLegendaryMarkingColor(gTasks[taskId].tCounter);
if ((gMPlayInfo_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 CB2_GoToBerryFixScreen(void)
{
if (!UpdatePaletteFade())
{
m4aMPlayAllStop();
SetMainCallback2(CB2_InitBerryFixProgram);
}
}
static void UpdateLegendaryMarkingColor(u8 frameNum)
{
if ((frameNum % 4) == 0) // Change color every 4th frame
{
s32 intensity = Cos(frameNum, 128) + 128;
s32 r = 31 - ((intensity * 32 - intensity) / 256);
s32 g = 31 - (intensity * 22 / 256);
s32 b = 12;
u16 color = RGB(r, g, b);
LoadPalette(&color, 0xEF, sizeof(color));
}
}
+10 -10
View File
@@ -1208,7 +1208,7 @@ void PutPokemonTodayFailedOnTheAir(void)
{
ct = 0xFF;
}
if (ct > 2 && (gBattleOutcome == BATTLE_POKE_FLED || gBattleOutcome == BATTLE_WON))
if (ct > 2 && (gBattleOutcome == B_OUTCOME_MON_FLED || gBattleOutcome == B_OUTCOME_WON))
{
sCurTVShowSlot = FindEmptyTVSlotBeyondFirstFiveShowsOfArray(gSaveBlock1Ptr->tvShows);
if (sCurTVShowSlot != -1 && HasMixableShowAlreadyBeenSpawnedWithPlayerID(TVSHOW_POKEMON_TODAY_FAILED, FALSE) != TRUE)
@@ -2402,23 +2402,23 @@ void sub_80EE184(void)
show->breakingNews.poke1Species = gBattleResults.playerMon1Species;
switch (gBattleOutcome)
{
case BATTLE_LOST:
case BATTLE_DREW:
case B_OUTCOME_LOST:
case B_OUTCOME_DREW:
show->breakingNews.kind = TVSHOW_OFF_AIR;
return;
case BATTLE_CAUGHT:
case B_OUTCOME_CAUGHT:
show->breakingNews.outcome = 0;
break;
case BATTLE_WON:
case B_OUTCOME_WON:
show->breakingNews.outcome = 1;
break;
case BATTLE_RAN:
case BATTLE_PLAYER_TELEPORTED:
case BATTLE_SAFARI_OUT_OF_BALLS:
case B_OUTCOME_RAN:
case B_OUTCOME_PLAYER_TELEPORTED:
case B_OUTCOME_NO_SAFARI_BALLS:
show->breakingNews.outcome = 2;
break;
case BATTLE_POKE_FLED:
case BATTLE_OPPONENT_TELEPORTED:
case B_OUTCOME_MON_FLED:
case B_OUTCOME_MON_TELEPORTED:
show->breakingNews.outcome = 3;
break;
}
+6 -6
View File
@@ -57,24 +57,24 @@ u16 Font6Func(struct TextPrinter *textPrinter)
switch (char_)
{
case 1:
textPrinter->subPrinter.fontColor_h = *textPrinter->subPrinter.current_text_offset ++;
GenerateFontHalfRowLookupTable(textPrinter->subPrinter.fontColor_h, textPrinter->subPrinter.bgColor, textPrinter->subPrinter.shadowColor);
textPrinter->subPrinter.fgColor = *textPrinter->subPrinter.current_text_offset ++;
GenerateFontHalfRowLookupTable(textPrinter->subPrinter.fgColor, textPrinter->subPrinter.bgColor, textPrinter->subPrinter.shadowColor);
return 2;
case 2:
textPrinter->subPrinter.bgColor = *textPrinter->subPrinter.current_text_offset ++;
GenerateFontHalfRowLookupTable(textPrinter->subPrinter.fontColor_h, textPrinter->subPrinter.bgColor, textPrinter->subPrinter.shadowColor);
GenerateFontHalfRowLookupTable(textPrinter->subPrinter.fgColor, textPrinter->subPrinter.bgColor, textPrinter->subPrinter.shadowColor);
return 2;
case 3:
textPrinter->subPrinter.shadowColor = *textPrinter->subPrinter.current_text_offset ++;
GenerateFontHalfRowLookupTable(textPrinter->subPrinter.fontColor_h, textPrinter->subPrinter.bgColor, textPrinter->subPrinter.shadowColor);
GenerateFontHalfRowLookupTable(textPrinter->subPrinter.fgColor, textPrinter->subPrinter.bgColor, textPrinter->subPrinter.shadowColor);
return 2;
case 4:
textPrinter->subPrinter.fontColor_h = *textPrinter->subPrinter.current_text_offset;
textPrinter->subPrinter.fgColor = *textPrinter->subPrinter.current_text_offset;
textPrinter->subPrinter.bgColor = *++ textPrinter->subPrinter.current_text_offset;
textPrinter->subPrinter.shadowColor = *++ textPrinter->subPrinter.current_text_offset;
textPrinter->subPrinter.current_text_offset ++;
GenerateFontHalfRowLookupTable(textPrinter->subPrinter.fontColor_h, textPrinter->subPrinter.bgColor, textPrinter->subPrinter.shadowColor);
GenerateFontHalfRowLookupTable(textPrinter->subPrinter.fgColor, textPrinter->subPrinter.bgColor, textPrinter->subPrinter.shadowColor);
return 2;
case 5:
textPrinter->subPrinter.current_text_offset ++;
+4558 -7
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -406,7 +406,7 @@ void PutWindowRectTilemap(u8 windowId, u8 x, u8 y, u8 width, u8 height)
}
}
void BlitBitmapToWindow(u8 windowId, u8 *pixels, u16 x, u16 y, u16 width, u16 height)
void BlitBitmapToWindow(u8 windowId, const u8 *pixels, u16 x, u16 y, u16 width, u16 height)
{
BlitBitmapRectToWindow(windowId, pixels, 0, 0, width, height, x, y, width, height);
}