Merge branch 'master' into pokenav_match_call

This commit is contained in:
PikalaxALT
2018-03-02 21:49:09 -05:00
84 changed files with 9045 additions and 14516 deletions

View File

@@ -45,7 +45,6 @@ in order to read the next command correctly. refer to battle_ai_scripts.s for th
AI scripts.
*/
extern const struct BattleMove gBattleMoves[];
extern const u8 * const gBattleAI_ScriptsTable[];
extern u32 GetAiScriptsInRecordedBattle();
@@ -346,7 +345,7 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves)
}
gBattleResources->AI_ScriptsStack->size = 0;
sBattler_AI = gActiveBattler;
// decide a random target bank in doubles
// decide a random target battlerId in doubles
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
gBattlerTarget = (Random() & BIT_FLANK) + (GetBattlerSide(gActiveBattler) ^ BIT_SIDE);
@@ -620,32 +619,32 @@ static void RecordLastUsedMoveByTarget(void)
}
}
void ClearBattlerMoveHistory(u8 bank)
void ClearBattlerMoveHistory(u8 battlerId)
{
s32 i;
for (i = 0; i < 4; i++)
gBattleResources->battleHistory->usedMoves[bank].moves[i] = 0;
gBattleResources->battleHistory->usedMoves[battlerId].moves[i] = 0;
}
void RecordAbilityBattle(u8 bank, u8 abilityId)
void RecordAbilityBattle(u8 battlerId, u8 abilityId)
{
gBattleResources->battleHistory->abilities[bank] = abilityId;
gBattleResources->battleHistory->abilities[battlerId] = abilityId;
}
void ClearBattlerAbilityHistory(u8 bank)
void ClearBattlerAbilityHistory(u8 battlerId)
{
gBattleResources->battleHistory->abilities[bank] = 0;
gBattleResources->battleHistory->abilities[battlerId] = 0;
}
void RecordItemEffectBattle(u8 bank, u8 itemEffect)
void RecordItemEffectBattle(u8 battlerId, u8 itemEffect)
{
gBattleResources->battleHistory->itemEffects[bank] = itemEffect;
gBattleResources->battleHistory->itemEffects[battlerId] = itemEffect;
}
void ClearBankItemEffectHistory(u8 bank)
void ClearBankItemEffectHistory(u8 battlerId)
{
gBattleResources->battleHistory->itemEffects[bank] = 0;
gBattleResources->battleHistory->itemEffects[battlerId] = 0;
}
static void BattleAICmd_if_random_less_than(void)
@@ -700,14 +699,14 @@ static void BattleAICmd_score(void)
static void BattleAICmd_if_hp_less_than(void)
{
u16 bank;
u16 battlerId;
if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI;
battlerId = sBattler_AI;
else
bank = gBattlerTarget;
battlerId = gBattlerTarget;
if ((u32)(100 * gBattleMons[bank].hp / gBattleMons[bank].maxHP) < gAIScriptPtr[2])
if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) < gAIScriptPtr[2])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
else
gAIScriptPtr += 7;
@@ -715,14 +714,14 @@ static void BattleAICmd_if_hp_less_than(void)
static void BattleAICmd_if_hp_more_than(void)
{
u16 bank;
u16 battlerId;
if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI;
battlerId = sBattler_AI;
else
bank = gBattlerTarget;
battlerId = gBattlerTarget;
if ((u32)(100 * gBattleMons[bank].hp / gBattleMons[bank].maxHP) > gAIScriptPtr[2])
if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) > gAIScriptPtr[2])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
else
gAIScriptPtr += 7;
@@ -730,14 +729,14 @@ static void BattleAICmd_if_hp_more_than(void)
static void BattleAICmd_if_hp_equal(void)
{
u16 bank;
u16 battlerId;
if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI;
battlerId = sBattler_AI;
else
bank = gBattlerTarget;
battlerId = gBattlerTarget;
if ((u32)(100 * gBattleMons[bank].hp / gBattleMons[bank].maxHP) == gAIScriptPtr[2])
if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) == gAIScriptPtr[2])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
else
gAIScriptPtr += 7;
@@ -745,14 +744,14 @@ static void BattleAICmd_if_hp_equal(void)
static void BattleAICmd_if_hp_not_equal(void)
{
u16 bank;
u16 battlerId;
if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI;
battlerId = sBattler_AI;
else
bank = gBattlerTarget;
battlerId = gBattlerTarget;
if ((u32)(100 * gBattleMons[bank].hp / gBattleMons[bank].maxHP) != gAIScriptPtr[2])
if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) != gAIScriptPtr[2])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
else
gAIScriptPtr += 7;
@@ -760,17 +759,17 @@ static void BattleAICmd_if_hp_not_equal(void)
static void BattleAICmd_if_status(void)
{
u16 bank;
u16 battlerId;
u32 status;
if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI;
battlerId = sBattler_AI;
else
bank = gBattlerTarget;
battlerId = gBattlerTarget;
status = AIScriptRead32(gAIScriptPtr + 2);
if ((gBattleMons[bank].status1 & status) != 0)
if ((gBattleMons[battlerId].status1 & status) != 0)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
else
gAIScriptPtr += 10;
@@ -778,17 +777,17 @@ static void BattleAICmd_if_status(void)
static void BattleAICmd_if_not_status(void)
{
u16 bank;
u16 battlerId;
u32 status;
if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI;
battlerId = sBattler_AI;
else
bank = gBattlerTarget;
battlerId = gBattlerTarget;
status = AIScriptRead32(gAIScriptPtr + 2);
if ((gBattleMons[bank].status1 & status) == 0)
if ((gBattleMons[battlerId].status1 & status) == 0)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
else
gAIScriptPtr += 10;
@@ -796,17 +795,17 @@ static void BattleAICmd_if_not_status(void)
static void BattleAICmd_if_status2(void)
{
u16 bank;
u16 battlerId;
u32 status;
if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI;
battlerId = sBattler_AI;
else
bank = gBattlerTarget;
battlerId = gBattlerTarget;
status = AIScriptRead32(gAIScriptPtr + 2);
if ((gBattleMons[bank].status2 & status) != 0)
if ((gBattleMons[battlerId].status2 & status) != 0)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
else
gAIScriptPtr += 10;
@@ -814,17 +813,17 @@ static void BattleAICmd_if_status2(void)
static void BattleAICmd_if_not_status2(void)
{
u16 bank;
u16 battlerId;
u32 status;
if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI;
battlerId = sBattler_AI;
else
bank = gBattlerTarget;
battlerId = gBattlerTarget;
status = AIScriptRead32(gAIScriptPtr + 2);
if ((gBattleMons[bank].status2 & status) == 0)
if ((gBattleMons[battlerId].status2 & status) == 0)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
else
gAIScriptPtr += 10;
@@ -832,17 +831,17 @@ static void BattleAICmd_if_not_status2(void)
static void BattleAICmd_if_status3(void)
{
u16 bank;
u16 battlerId;
u32 status;
if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI;
battlerId = sBattler_AI;
else
bank = gBattlerTarget;
battlerId = gBattlerTarget;
status = AIScriptRead32(gAIScriptPtr + 2);
if ((gStatuses3[bank] & status) != 0)
if ((gStatuses3[battlerId] & status) != 0)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
else
gAIScriptPtr += 10;
@@ -850,17 +849,17 @@ static void BattleAICmd_if_status3(void)
static void BattleAICmd_if_not_status3(void)
{
u16 bank;
u16 battlerId;
u32 status;
if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI;
battlerId = sBattler_AI;
else
bank = gBattlerTarget;
battlerId = gBattlerTarget;
status = AIScriptRead32(gAIScriptPtr + 2);
if ((gStatuses3[bank] & status) == 0)
if ((gStatuses3[battlerId] & status) == 0)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 6);
else
gAIScriptPtr += 10;
@@ -868,15 +867,15 @@ static void BattleAICmd_if_not_status3(void)
static void BattleAICmd_if_side_affecting(void)
{
u16 bank;
u16 battlerId;
u32 side, status;
if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI;
battlerId = sBattler_AI;
else
bank = gBattlerTarget;
battlerId = gBattlerTarget;
side = GET_BATTLER_SIDE(bank);
side = GET_BATTLER_SIDE(battlerId);
status = AIScriptRead32(gAIScriptPtr + 2);
if ((gSideStatuses[side] & status) != 0)
@@ -887,15 +886,15 @@ static void BattleAICmd_if_side_affecting(void)
static void BattleAICmd_if_not_side_affecting(void)
{
u16 bank;
u16 battlerId;
u32 side, status;
if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI;
battlerId = sBattler_AI;
else
bank = gBattlerTarget;
battlerId = gBattlerTarget;
side = GET_BATTLER_SIDE(bank);
side = GET_BATTLER_SIDE(battlerId);
status = AIScriptRead32(gAIScriptPtr + 2);
if ((gSideStatuses[side] & status) == 0)
@@ -1123,9 +1122,9 @@ static void BattleAICmd_get_type(void)
gAIScriptPtr += 2;
}
static u8 BattleAI_GetWantedBank(u8 bank)
static u8 BattleAI_GetWantedBank(u8 battlerId)
{
switch (bank)
switch (battlerId)
{
case AI_USER:
return sBattler_AI;
@@ -1141,9 +1140,9 @@ static u8 BattleAI_GetWantedBank(u8 bank)
static void BattleAICmd_is_of_type(void)
{
u8 bank = BattleAI_GetWantedBank(gAIScriptPtr[1]);
u8 battlerId = BattleAI_GetWantedBank(gAIScriptPtr[1]);
if(gBattleMons[bank].type1 == gAIScriptPtr[2] || gBattleMons[bank].type2 == gAIScriptPtr[2])
if(gBattleMons[battlerId].type1 == gAIScriptPtr[2] || gBattleMons[battlerId].type2 == gAIScriptPtr[2])
{
AI_THINKING_STRUCT->funcResult = TRUE;
}
@@ -1277,7 +1276,7 @@ static void BattleAICmd_nullsub_2B(void)
static void BattleAICmd_count_usable_party_mons(void)
{
u8 bank;
u8 battlerId;
u8 bankOnField1, bankOnField2;
struct Pokemon *party;
int i;
@@ -1285,11 +1284,11 @@ static void BattleAICmd_count_usable_party_mons(void)
AI_THINKING_STRUCT->funcResult = 0;
if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI;
battlerId = sBattler_AI;
else
bank = gBattlerTarget;
battlerId = gBattlerTarget;
if (GetBattlerSide(bank) == B_SIDE_PLAYER)
if (GetBattlerSide(battlerId) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
@@ -1297,14 +1296,14 @@ static void BattleAICmd_count_usable_party_mons(void)
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
u32 position;
bankOnField1 = gBattlerPartyIndexes[bank];
position = GetBattlerPosition(bank) ^ BIT_FLANK;
bankOnField1 = gBattlerPartyIndexes[battlerId];
position = GetBattlerPosition(battlerId) ^ BIT_FLANK;
bankOnField2 = gBattlerPartyIndexes[GetBattlerAtPosition(position)];
}
else // in singles there's only one bank by side
else // in singles there's only one battlerId by side
{
bankOnField1 = gBattlerPartyIndexes[bank];
bankOnField2 = gBattlerPartyIndexes[bank];
bankOnField1 = gBattlerPartyIndexes[battlerId];
bankOnField2 = gBattlerPartyIndexes[battlerId];
}
for (i = 0; i < PARTY_SIZE; i++)
@@ -1335,110 +1334,110 @@ static void BattleAICmd_get_considered_move_effect(void)
static void BattleAICmd_get_ability(void)
{
u8 bank;
u8 battlerId;
if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI;
battlerId = sBattler_AI;
else
bank = gBattlerTarget;
battlerId = gBattlerTarget;
if (gActiveBattler != bank)
if (gActiveBattler != battlerId)
{
if (BATTLE_HISTORY->abilities[bank] != 0)
if (BATTLE_HISTORY->abilities[battlerId] != 0)
{
AI_THINKING_STRUCT->funcResult = BATTLE_HISTORY->abilities[bank];
AI_THINKING_STRUCT->funcResult = BATTLE_HISTORY->abilities[battlerId];
gAIScriptPtr += 2;
return;
}
// abilities that prevent fleeing.
if (gBattleMons[bank].ability == ABILITY_SHADOW_TAG
|| gBattleMons[bank].ability == ABILITY_MAGNET_PULL
|| gBattleMons[bank].ability == ABILITY_ARENA_TRAP)
if (gBattleMons[battlerId].ability == ABILITY_SHADOW_TAG
|| gBattleMons[battlerId].ability == ABILITY_MAGNET_PULL
|| gBattleMons[battlerId].ability == ABILITY_ARENA_TRAP)
{
AI_THINKING_STRUCT->funcResult = gBattleMons[bank].ability;
AI_THINKING_STRUCT->funcResult = gBattleMons[battlerId].ability;
gAIScriptPtr += 2;
return;
}
if (gBaseStats[gBattleMons[bank].species].ability1 != ABILITY_NONE)
if (gBaseStats[gBattleMons[battlerId].species].ability1 != ABILITY_NONE)
{
if (gBaseStats[gBattleMons[bank].species].ability2 != ABILITY_NONE)
if (gBaseStats[gBattleMons[battlerId].species].ability2 != ABILITY_NONE)
{
// AI has no knowledge of opponent, so it guesses which ability.
if (Random() & 1)
{
AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[bank].species].ability1;
AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[battlerId].species].ability1;
}
else
{
AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[bank].species].ability2;
AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[battlerId].species].ability2;
}
}
else
{
AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[bank].species].ability1; // it's definitely ability 1.
AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[battlerId].species].ability1; // it's definitely ability 1.
}
}
else
{
AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[bank].species].ability2; // AI cant actually reach this part since every mon has at least 1 ability.
AI_THINKING_STRUCT->funcResult = gBaseStats[gBattleMons[battlerId].species].ability2; // AI cant actually reach this part since every mon has at least 1 ability.
}
}
else
{
// The AI knows its own ability.
AI_THINKING_STRUCT->funcResult = gBattleMons[bank].ability;
AI_THINKING_STRUCT->funcResult = gBattleMons[battlerId].ability;
}
gAIScriptPtr += 2;
}
static void BattleAICmd_check_ability(void)
{
u32 bank = BattleAI_GetWantedBank(gAIScriptPtr[1]);
u32 battlerId = BattleAI_GetWantedBank(gAIScriptPtr[1]);
u32 ability = gAIScriptPtr[2];
if (gAIScriptPtr[1] == AI_TARGET || gAIScriptPtr[1] == AI_TARGET_PARTNER)
{
if (BATTLE_HISTORY->abilities[bank] != 0)
if (BATTLE_HISTORY->abilities[battlerId] != 0)
{
ability = BATTLE_HISTORY->abilities[bank];
ability = BATTLE_HISTORY->abilities[battlerId];
AI_THINKING_STRUCT->funcResult = ability;
}
// abilities that prevent fleeing.
else if (gBattleMons[bank].ability == ABILITY_SHADOW_TAG
|| gBattleMons[bank].ability == ABILITY_MAGNET_PULL
|| gBattleMons[bank].ability == ABILITY_ARENA_TRAP)
else if (gBattleMons[battlerId].ability == ABILITY_SHADOW_TAG
|| gBattleMons[battlerId].ability == ABILITY_MAGNET_PULL
|| gBattleMons[battlerId].ability == ABILITY_ARENA_TRAP)
{
ability = gBattleMons[bank].ability;
ability = gBattleMons[battlerId].ability;
}
else if (gBaseStats[gBattleMons[bank].species].ability1 != ABILITY_NONE)
else if (gBaseStats[gBattleMons[battlerId].species].ability1 != ABILITY_NONE)
{
if (gBaseStats[gBattleMons[bank].species].ability2 != ABILITY_NONE)
if (gBaseStats[gBattleMons[battlerId].species].ability2 != ABILITY_NONE)
{
u8 abilityDummyVariable = ability; // needed to match
if (gBaseStats[gBattleMons[bank].species].ability1 != abilityDummyVariable
&& gBaseStats[gBattleMons[bank].species].ability2 != abilityDummyVariable)
if (gBaseStats[gBattleMons[battlerId].species].ability1 != abilityDummyVariable
&& gBaseStats[gBattleMons[battlerId].species].ability2 != abilityDummyVariable)
{
ability = gBaseStats[gBattleMons[bank].species].ability1;
ability = gBaseStats[gBattleMons[battlerId].species].ability1;
}
else
ability = 0;
}
else
{
ability = gBaseStats[gBattleMons[bank].species].ability1;
ability = gBaseStats[gBattleMons[battlerId].species].ability1;
}
}
else
{
ability = gBaseStats[gBattleMons[bank].species].ability2; // AI cant actually reach this part since every mon has at least 1 ability.
ability = gBaseStats[gBattleMons[battlerId].species].ability2; // AI cant actually reach this part since every mon has at least 1 ability.
}
}
else
{
// The AI knows its own or partner's ability.
ability = gBattleMons[bank].ability;
ability = gBattleMons[battlerId].ability;
}
if (ability == 0)
{
@@ -1546,19 +1545,19 @@ static void BattleAICmd_if_status_in_party(void)
struct Pokemon *party;
int i;
u32 statusToCompareTo;
u8 bank;
u8 battlerId;
switch(gAIScriptPtr[1])
{
case AI_USER:
bank = sBattler_AI;
battlerId = sBattler_AI;
break;
default:
bank = gBattlerTarget;
battlerId = gBattlerTarget;
break;
}
party = (GetBattlerSide(bank) == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty;
party = (GetBattlerSide(battlerId) == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty;
statusToCompareTo = AIScriptRead32(gAIScriptPtr + 2);
@@ -1583,19 +1582,19 @@ static void BattleAICmd_if_status_not_in_party(void)
struct Pokemon *party;
int i;
u32 statusToCompareTo;
u8 bank;
u8 battlerId;
switch(gAIScriptPtr[1])
{
case 1:
bank = sBattler_AI;
battlerId = sBattler_AI;
break;
default:
bank = gBattlerTarget;
battlerId = gBattlerTarget;
break;
}
party = (GetBattlerSide(bank) == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty;
party = (GetBattlerSide(battlerId) == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty;
statusToCompareTo = AIScriptRead32(gAIScriptPtr + 2);
@@ -1646,14 +1645,14 @@ static void BattleAICmd_if_not_effect(void)
static void BattleAICmd_if_stat_level_less_than(void)
{
u32 bank;
u32 battlerId;
if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI;
battlerId = sBattler_AI;
else
bank = gBattlerTarget;
battlerId = gBattlerTarget;
if (gBattleMons[bank].statStages[gAIScriptPtr[2]] < gAIScriptPtr[3])
if (gBattleMons[battlerId].statStages[gAIScriptPtr[2]] < gAIScriptPtr[3])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
else
gAIScriptPtr += 8;
@@ -1661,14 +1660,14 @@ static void BattleAICmd_if_stat_level_less_than(void)
static void BattleAICmd_if_stat_level_more_than(void)
{
u32 bank;
u32 battlerId;
if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI;
battlerId = sBattler_AI;
else
bank = gBattlerTarget;
battlerId = gBattlerTarget;
if (gBattleMons[bank].statStages[gAIScriptPtr[2]] > gAIScriptPtr[3])
if (gBattleMons[battlerId].statStages[gAIScriptPtr[2]] > gAIScriptPtr[3])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
else
gAIScriptPtr += 8;
@@ -1676,14 +1675,14 @@ static void BattleAICmd_if_stat_level_more_than(void)
static void BattleAICmd_if_stat_level_equal(void)
{
u32 bank;
u32 battlerId;
if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI;
battlerId = sBattler_AI;
else
bank = gBattlerTarget;
battlerId = gBattlerTarget;
if (gBattleMons[bank].statStages[gAIScriptPtr[2]] == gAIScriptPtr[3])
if (gBattleMons[battlerId].statStages[gAIScriptPtr[2]] == gAIScriptPtr[3])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
else
gAIScriptPtr += 8;
@@ -1691,14 +1690,14 @@ static void BattleAICmd_if_stat_level_equal(void)
static void BattleAICmd_if_stat_level_not_equal(void)
{
u32 bank;
u32 battlerId;
if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI;
battlerId = sBattler_AI;
else
bank = gBattlerTarget;
battlerId = gBattlerTarget;
if (gBattleMons[bank].statStages[gAIScriptPtr[2]] != gAIScriptPtr[3])
if (gBattleMons[battlerId].statStages[gAIScriptPtr[2]] != gAIScriptPtr[3])
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 4);
else
gAIScriptPtr += 8;
@@ -1940,16 +1939,16 @@ static void BattleAICmd_if_doesnt_have_move_with_effect(void)
static void BattleAICmd_if_any_move_disabled_or_encored(void)
{
u8 bank;
u8 battlerId;
if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI;
battlerId = sBattler_AI;
else
bank = gBattlerTarget;
battlerId = gBattlerTarget;
if (gAIScriptPtr[2] == 0)
{
if (gDisableStructs[bank].disabledMove == 0)
if (gDisableStructs[battlerId].disabledMove == 0)
{
gAIScriptPtr += 7;
return;
@@ -1962,7 +1961,7 @@ static void BattleAICmd_if_any_move_disabled_or_encored(void)
gAIScriptPtr += 7;
return;
}
else if (gDisableStructs[bank].encoredMove != 0)
else if (gDisableStructs[battlerId].encoredMove != 0)
{
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 3);
return;
@@ -2018,31 +2017,31 @@ static void BattleAICmd_watch(void)
static void BattleAICmd_get_hold_effect(void)
{
u8 bank;
u8 battlerId;
if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI;
battlerId = sBattler_AI;
else
bank = gBattlerTarget;
battlerId = gBattlerTarget;
if (gActiveBattler != bank)
AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(BATTLE_HISTORY->itemEffects[bank]);
if (gActiveBattler != battlerId)
AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(BATTLE_HISTORY->itemEffects[battlerId]);
else
AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(gBattleMons[bank].item);
AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(gBattleMons[battlerId].item);
gAIScriptPtr += 2;
}
static void BattleAICmd_if_holds_item(void)
{
u8 bank = BattleAI_GetWantedBank(gAIScriptPtr[1]);
u8 battlerId = BattleAI_GetWantedBank(gAIScriptPtr[1]);
u16 item;
u8 var1, var2;
if ((bank & BIT_SIDE) == (sBattler_AI & BIT_SIDE))
item = gBattleMons[bank].item;
if ((battlerId & BIT_SIDE) == (sBattler_AI & BIT_SIDE))
item = gBattleMons[battlerId].item;
else
item = BATTLE_HISTORY->itemEffects[bank];
item = BATTLE_HISTORY->itemEffects[battlerId];
// UB: doesn't properly read an unaligned u16
var2 = gAIScriptPtr[2];
@@ -2056,42 +2055,42 @@ static void BattleAICmd_if_holds_item(void)
static void BattleAICmd_get_gender(void)
{
u8 bank;
u8 battlerId;
if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI;
battlerId = sBattler_AI;
else
bank = gBattlerTarget;
battlerId = gBattlerTarget;
AI_THINKING_STRUCT->funcResult = GetGenderFromSpeciesAndPersonality(gBattleMons[bank].species, gBattleMons[bank].personality);
AI_THINKING_STRUCT->funcResult = GetGenderFromSpeciesAndPersonality(gBattleMons[battlerId].species, gBattleMons[battlerId].personality);
gAIScriptPtr += 2;
}
static void BattleAICmd_is_first_turn_for(void)
{
u8 bank;
u8 battlerId;
if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI;
battlerId = sBattler_AI;
else
bank = gBattlerTarget;
battlerId = gBattlerTarget;
AI_THINKING_STRUCT->funcResult = gDisableStructs[bank].isFirstTurn;
AI_THINKING_STRUCT->funcResult = gDisableStructs[battlerId].isFirstTurn;
gAIScriptPtr += 2;
}
static void BattleAICmd_get_stockpile_count(void)
{
u8 bank;
u8 battlerId;
if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI;
battlerId = sBattler_AI;
else
bank = gBattlerTarget;
battlerId = gBattlerTarget;
AI_THINKING_STRUCT->funcResult = gDisableStructs[bank].stockpileCounter;
AI_THINKING_STRUCT->funcResult = gDisableStructs[battlerId].stockpileCounter;
gAIScriptPtr += 2;
}
@@ -2105,18 +2104,18 @@ static void BattleAICmd_is_double_battle(void)
static void BattleAICmd_get_used_held_item(void)
{
u8 bank;
u8 battlerId;
if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI;
battlerId = sBattler_AI;
else
bank = gBattlerTarget;
battlerId = gBattlerTarget;
// This is likely a leftover from Ruby's code and its ugly ewram access
#ifdef NONMATCHING
AI_THINKING_STRUCT->funcResult = gBattleStruct->usedHeldItems[bank];
AI_THINKING_STRUCT->funcResult = gBattleStruct->usedHeldItems[battlerId];
#else
AI_THINKING_STRUCT->funcResult = *(u8*)((u8*)(gBattleStruct) + offsetof(struct BattleStruct, usedHeldItems) + (bank * 2));
AI_THINKING_STRUCT->funcResult = *(u8*)((u8*)(gBattleStruct) + offsetof(struct BattleStruct, usedHeldItems) + (battlerId * 2));
#endif // NONMATCHING
gAIScriptPtr += 2;
@@ -2145,14 +2144,14 @@ static void BattleAICmd_get_move_effect_from_result(void)
static void BattleAICmd_get_protect_count(void)
{
u8 bank;
u8 battlerId;
if (gAIScriptPtr[1] == AI_USER)
bank = sBattler_AI;
battlerId = sBattler_AI;
else
bank = gBattlerTarget;
battlerId = gBattlerTarget;
AI_THINKING_STRUCT->funcResult = gDisableStructs[bank].protectUses;
AI_THINKING_STRUCT->funcResult = gDisableStructs[battlerId].protectUses;
gAIScriptPtr += 2;
}
@@ -2255,9 +2254,9 @@ static void BattleAICmd_if_target_is_ally(void)
static void BattleAICmd_if_flash_fired(void)
{
u8 bank = BattleAI_GetWantedBank(gAIScriptPtr[1]);
u8 battlerId = BattleAI_GetWantedBank(gAIScriptPtr[1]);
if (gBattleResources->flags->flags[bank] & UNKNOWN_FLAG_FLASH_FIRE)
if (gBattleResources->flags->flags[battlerId] & UNKNOWN_FLAG_FLASH_FIRE)
gAIScriptPtr = AIScriptReadPtr(gAIScriptPtr + 2);
else
gAIScriptPtr += 6;

View File

@@ -9,8 +9,6 @@
#include "util.h"
#include "constants/items.h"
extern const struct BattleMove gBattleMoves[];
extern const u8 gTypeEffectiveness[];
extern const u8 * const gItemEffectTable[]; // todo: fix once struct is declared
// this file's functions

View File

@@ -6,7 +6,7 @@
#include "battle_anim.h"
#include "constants/battle_anim.h"
#include "battle_ai_script_commands.h"
#include "battle_link_817C95C.h"
#include "battle_tv.h"
#include "pokemon.h"
#include "link.h"
#include "util.h"
@@ -32,7 +32,6 @@ extern struct MusicPlayerInfo gMPlayInfo_BGM;
extern struct UnusedControllerStruct gUnknown_02022D0C;
extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[];
extern const struct BattleMove gBattleMoves[];
extern void sub_8172EF0(u8 bank, struct Pokemon *mon);
extern void sub_806A068(u16, u8);
@@ -1414,7 +1413,7 @@ static void LinkOpponentHandleMoveAnimation(void)
{
gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
gBattlerControllerFuncs[gActiveBattler] = LinkOpponentDoMoveAnimation;
sub_817E0FC(move, gWeatherMoveAnim, gAnimDisableStructPtr);
BattleTv_SetDataBasedOnMove(move, gWeatherMoveAnim, gAnimDisableStructPtr);
}
}
}
@@ -1478,7 +1477,7 @@ static void LinkOpponentHandlePrintString(void)
BufferStringBattle(*stringId);
BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter;
sub_817C95C(*stringId);
BattleTv_SetDataBasedOnString(*stringId);
}
static void LinkOpponentHandlePrintSelectionString(void)
@@ -1831,7 +1830,7 @@ static void LinkOpponentHandleBattleAnimation(void)
else
gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation;
sub_817E32C(animationId);
BattleTv_SetDataBasedOnAnimation(animationId);
}
}

View File

@@ -6,7 +6,7 @@
#include "battle_anim.h"
#include "constants/battle_anim.h"
#include "battle_ai_script_commands.h"
#include "battle_link_817C95C.h"
#include "battle_tv.h"
#include "pokemon.h"
#include "link.h"
#include "util.h"
@@ -31,7 +31,6 @@ extern struct UnusedControllerStruct gUnknown_02022D0C;
extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[];
extern const struct CompressedSpritePalette gTrainerBackPicPaletteTable[];
extern const struct BattleMove gBattleMoves[];
extern void sub_8172EF0(u8 bank, struct Pokemon *mon);
extern void sub_806A068(u16, u8);
@@ -1238,7 +1237,7 @@ static void LinkPartnerHandleMoveAnimation(void)
{
gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
gBattlerControllerFuncs[gActiveBattler] = LinkPartnerDoMoveAnimation;
sub_817E0FC(move, gWeatherMoveAnim, gAnimDisableStructPtr);
BattleTv_SetDataBasedOnMove(move, gWeatherMoveAnim, gAnimDisableStructPtr);
}
}
}
@@ -1302,7 +1301,7 @@ static void LinkPartnerHandlePrintString(void)
BufferStringBattle(*stringId);
BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter;
sub_817C95C(*stringId);
BattleTv_SetDataBasedOnString(*stringId);
}
static void LinkPartnerHandlePrintSelectionString(void)
@@ -1666,7 +1665,7 @@ static void LinkPartnerHandleBattleAnimation(void)
else
gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation;
sub_817E32C(animationId);
BattleTv_SetDataBasedOnAnimation(animationId);
}
}

View File

@@ -5,7 +5,7 @@
#include "battle_interface.h"
#include "battle_anim.h"
#include "constants/battle_anim.h"
#include "battle_link_817C95C.h"
#include "battle_tv.h"
#include "battle_ai_script_commands.h"
#include "pokemon.h"
#include "link.h"
@@ -35,7 +35,6 @@ extern struct MusicPlayerInfo gMPlayInfo_BGM;
extern struct UnusedControllerStruct gUnknown_02022D0C;
extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[];
extern const struct BattleMove gBattleMoves[];
extern void sub_8172EF0(u8 bank, struct Pokemon *mon);
extern void sub_806A068(u16, u8);
@@ -1563,7 +1562,7 @@ static void OpponentHandleChooseMove(void)
BtlController_EmitTwoReturnValues(1, 15, gBattlerTarget);
break;
default:
if (gBattleMoves[moveInfo->moves[chosenMoveId]].target & (MOVE_TARGET_USER | MOVE_TARGET_x10))
if (gBattleMoves[moveInfo->moves[chosenMoveId]].target & (MOVE_TARGET_USER_OR_SELECTED | MOVE_TARGET_USER))
gBattlerTarget = gActiveBattler;
if (gBattleMoves[moveInfo->moves[chosenMoveId]].target & MOVE_TARGET_BOTH)
{
@@ -1585,7 +1584,7 @@ static void OpponentHandleChooseMove(void)
move = moveInfo->moves[chosenMoveId];
} while (move == MOVE_NONE);
if (gBattleMoves[move].target & (MOVE_TARGET_USER | MOVE_TARGET_x10))
if (gBattleMoves[move].target & (MOVE_TARGET_USER_OR_SELECTED | MOVE_TARGET_USER))
BtlController_EmitTwoReturnValues(1, 10, (chosenMoveId) | (gActiveBattler << 8));
else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
BtlController_EmitTwoReturnValues(1, 10, (chosenMoveId) | (GetBattlerAtPosition(Random() & 2) << 8));

View File

@@ -5,7 +5,7 @@
#include "battle_interface.h"
#include "battle_anim.h"
#include "constants/battle_anim.h"
#include "battle_link_817C95C.h"
#include "battle_tv.h"
#include "pokemon.h"
#include "link.h"
#include "util.h"
@@ -42,8 +42,6 @@ extern struct SpriteTemplate gUnknown_0202499C;
extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[];
extern const struct CompressedSpritePalette gTrainerBackPicPaletteTable[];
extern const u8 gTypeNames[][7];
extern const struct BattleMove gBattleMoves[];
extern const u8 gText_BattleSwitchWhich[];
extern const u8 gText_MoveInterfacePP[];
@@ -432,7 +430,7 @@ static void HandleInputChooseTarget(void)
case B_POSITION_PLAYER_RIGHT:
if (gActiveBattler != gMultiUsePlayerCursor)
i++;
else if (gBattleMoves[GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + gMoveSelectionCursor[gActiveBattler])].target & MOVE_TARGET_USER)
else if (gBattleMoves[GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + gMoveSelectionCursor[gActiveBattler])].target & MOVE_TARGET_USER_OR_SELECTED)
i++;
break;
case B_POSITION_OPPONENT_LEFT:
@@ -474,7 +472,7 @@ static void HandleInputChooseTarget(void)
case B_POSITION_PLAYER_RIGHT:
if (gActiveBattler != gMultiUsePlayerCursor)
i++;
else if (gBattleMoves[GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + gMoveSelectionCursor[gActiveBattler])].target & MOVE_TARGET_USER)
else if (gBattleMoves[GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_MOVE1 + gMoveSelectionCursor[gActiveBattler])].target & MOVE_TARGET_USER_OR_SELECTED)
i++;
break;
case B_POSITION_OPPONENT_LEFT:
@@ -508,7 +506,7 @@ static void HandleInputChooseMove(void)
if (moveInfo->moves[gMoveSelectionCursor[gActiveBattler]] == MOVE_CURSE)
{
if (moveInfo->monType1 != TYPE_GHOST && moveInfo->monType2 != TYPE_GHOST)
moveTarget = MOVE_TARGET_x10;
moveTarget = MOVE_TARGET_USER;
else
moveTarget = MOVE_TARGET_SELECTED;
}
@@ -517,26 +515,26 @@ static void HandleInputChooseMove(void)
moveTarget = gBattleMoves[moveInfo->moves[gMoveSelectionCursor[gActiveBattler]]].target;
}
if (moveTarget & MOVE_TARGET_x10)
if (moveTarget & MOVE_TARGET_USER)
gMultiUsePlayerCursor = gActiveBattler;
else
gMultiUsePlayerCursor = GetBattlerAtPosition((GetBattlerPosition(gActiveBattler) & BIT_SIDE) ^ BIT_SIDE);
if (!gBattleBufferA[gActiveBattler][1]) // not a double battle
{
if (moveTarget & MOVE_TARGET_USER && !gBattleBufferA[gActiveBattler][2])
if (moveTarget & MOVE_TARGET_USER_OR_SELECTED && !gBattleBufferA[gActiveBattler][2])
canSelectTarget++;
}
else // double battle
{
if (!(moveTarget & (MOVE_TARGET_RANDOM | MOVE_TARGET_BOTH | MOVE_TARGET_DEPENDS | MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_x10)))
if (!(moveTarget & (MOVE_TARGET_RANDOM | MOVE_TARGET_BOTH | MOVE_TARGET_DEPENDS | MOVE_TARGET_FOES_AND_ALLY | MOVE_TARGET_OPPONENTS_FIELD | MOVE_TARGET_USER)))
canSelectTarget++; // either selected or user
if (moveInfo->currentPp[gMoveSelectionCursor[gActiveBattler]] == 0)
{
canSelectTarget = FALSE;
}
else if (!(moveTarget & (MOVE_TARGET_x10 | MOVE_TARGET_USER)) && CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_ACTIVE) <= 1)
else if (!(moveTarget & (MOVE_TARGET_USER | MOVE_TARGET_USER_OR_SELECTED)) && CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_ACTIVE) <= 1)
{
gMultiUsePlayerCursor = GetDefaultMoveTarget(gActiveBattler);
canSelectTarget = FALSE;
@@ -552,7 +550,7 @@ static void HandleInputChooseMove(void)
{
gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseTarget;
if (moveTarget & (MOVE_TARGET_x10 | MOVE_TARGET_USER))
if (moveTarget & (MOVE_TARGET_USER | MOVE_TARGET_USER_OR_SELECTED))
gMultiUsePlayerCursor = gActiveBattler;
else if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)])
gMultiUsePlayerCursor = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
@@ -881,7 +879,7 @@ static void sub_80586F8(void)
gMain.callback1 = gPreBattleCallback1;
SetMainCallback2(sub_8038D64);
if (gBattleOutcome == B_OUTCOME_WON)
sub_817E3F4();
TryPutLinkBattleTvShowOnAir();
FreeAllWindowBuffers();
}
}
@@ -894,7 +892,7 @@ static void sub_80586F8(void)
gMain.callback1 = gPreBattleCallback1;
SetMainCallback2(sub_8038D64);
if (gBattleOutcome == B_OUTCOME_WON)
sub_817E3F4();
TryPutLinkBattleTvShowOnAir();
FreeAllWindowBuffers();
}
}
@@ -2484,7 +2482,7 @@ static void PlayerHandleMoveAnimation(void)
{
gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animationState = 0;
gBattlerControllerFuncs[gActiveBattler] = PlayerDoMoveAnimation;
sub_817E0FC(move, gWeatherMoveAnim, gAnimDisableStructPtr);
BattleTv_SetDataBasedOnMove(move, gWeatherMoveAnim, gAnimDisableStructPtr);
}
}
}
@@ -2548,7 +2546,7 @@ static void PlayerHandlePrintString(void)
BufferStringBattle(*stringId);
BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter2;
sub_817C95C(*stringId);
BattleTv_SetDataBasedOnString(*stringId);
sub_81A57E4(gActiveBattler, *stringId);
}
@@ -2575,7 +2573,7 @@ static void PlayerHandleChooseAction(void)
s32 i;
gBattlerControllerFuncs[gActiveBattler] = HandleChooseActionAfterDma3;
sub_817F2A8();
BattleTv_ClearExplosionFaintCause();
BattleHandleAddTextPrinter(gText_BattleMenu, 2);
for (i = 0; i < 4; i++)
@@ -3069,7 +3067,7 @@ static void PlayerHandleBattleAnimation(void)
else
gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation;
sub_817E32C(animationId);
BattleTv_SetDataBasedOnAnimation(animationId);
}
}

View File

@@ -31,7 +31,6 @@ extern struct UnusedControllerStruct gUnknown_02022D0C;
extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[];
extern const struct CompressedSpritePalette gTrainerBackPicPaletteTable[];
extern const struct BattleMove gBattleMoves[];
extern void sub_81358F4(void);
extern void sub_8172EF0(u8 bank, struct Pokemon *mon);
@@ -1521,7 +1520,7 @@ static void PlayerPartnerHandleChooseMove(void)
BattleAI_SetupAIData(0xF);
chosenMoveId = BattleAI_ChooseMoveOrAction();
if (gBattleMoves[moveInfo->moves[chosenMoveId]].target & (MOVE_TARGET_x10 | MOVE_TARGET_USER))
if (gBattleMoves[moveInfo->moves[chosenMoveId]].target & (MOVE_TARGET_USER | MOVE_TARGET_USER_OR_SELECTED))
gBattlerTarget = gActiveBattler;
if (gBattleMoves[moveInfo->moves[chosenMoveId]].target & MOVE_TARGET_BOTH)
{

View File

@@ -6,7 +6,7 @@
#include "battle_anim.h"
#include "constants/battle_anim.h"
#include "battle_ai_script_commands.h"
#include "battle_link_817C95C.h"
#include "battle_tv.h"
#include "recorded_battle.h"
#include "pokemon.h"
#include "link.h"

View File

@@ -34,7 +34,6 @@ extern struct UnusedControllerStruct gUnknown_02022D0C;
extern const struct CompressedSpritePalette gTrainerFrontPicPaletteTable[];
extern const struct CompressedSpritePalette gTrainerBackPicPaletteTable[];
extern const struct BattleMove gBattleMoves[];
extern void sub_8172EF0(u8 bank, struct Pokemon *mon);
extern void sub_806A068(u16, u8);

View File

@@ -5,7 +5,7 @@
#include "battle_interface.h"
#include "battle_anim.h"
#include "constants/battle_anim.h"
#include "battle_link_817C95C.h"
#include "battle_tv.h"
#include "pokemon.h"
#include "link.h"
#include "util.h"

View File

@@ -36,7 +36,6 @@ extern u8 gBattleBuffersTransferData[0x100];
static EWRAM_DATA u8 sBattleBuffersTransferData[0x100] = {};
extern const struct BattleMove gBattleMoves[];
extern void task00_08081A90(u8 taskId); // cable_club
extern void sub_81B8D64(u8 bank, u8 arg1); // party_menu
@@ -97,7 +96,6 @@ void SetUpBattleVarsAndBirchZigzagoon(void)
void sub_8032768(void)
{
s32 i;
u8 *data;
if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED))
sub_8184DA4(1);
@@ -120,11 +118,11 @@ void sub_8032768(void)
sub_81B8D64(i, 0);
}
for (i = 0; i < sizeof(gBattleStruct->field_1A4); i++)
*(gBattleStruct->field_1A4 + i) = 0;
for (i = 0; i < sizeof(gBattleStruct->tvMovePoints); i++)
*((u8*)(&gBattleStruct->tvMovePoints) + i) = 0;
for (i = 0; i < sizeof(gBattleStruct->field_204); i++)
*(gBattleStruct->field_204 + i) = 0;
for (i = 0; i < sizeof(gBattleStruct->tv); i++)
*((u8*)(&gBattleStruct->tv) + i) = 0;
}
static void InitSinglePlayerBtlControllers(void)

View File

@@ -28,7 +28,6 @@ extern struct MusicPlayerInfo gMPlayInfo_SE1;
extern struct MusicPlayerInfo gMPlayInfo_SE2;
extern struct MusicPlayerInfo gMPlayInfo_BGM;
extern const struct BattleMove gBattleMoves[];
extern const u8 gUnknown_0831C604[];
extern const u8 * const gBattleAnims_VariousTable[];
extern const u8 * const gBattleAnims_Special[];
@@ -237,7 +236,7 @@ u16 ChooseMoveAndTargetInBattlePalace(void)
if (moveInfo->moves[chosenMoveId] == MOVE_CURSE)
{
if (moveInfo->monType1 != TYPE_GHOST && moveInfo->monType2 != TYPE_GHOST)
var1 = MOVE_TARGET_x10;
var1 = MOVE_TARGET_USER;
else
var1 = MOVE_TARGET_SELECTED;
}
@@ -246,7 +245,7 @@ u16 ChooseMoveAndTargetInBattlePalace(void)
var1 = gBattleMoves[moveInfo->moves[chosenMoveId]].target;
}
if (var1 & MOVE_TARGET_x10)
if (var1 & MOVE_TARGET_USER)
chosenMoveId |= (gActiveBattler << 8);
else if (var1 == MOVE_TARGET_SELECTED)
chosenMoveId |= (BattlePalaceGetTargetRetValue());
@@ -261,7 +260,7 @@ static u8 sub_805D4A8(u16 move)
switch (gBattleMoves[move].target)
{
case MOVE_TARGET_SELECTED:
case MOVE_TARGET_USER:
case MOVE_TARGET_USER_OR_SELECTED:
case MOVE_TARGET_RANDOM:
case MOVE_TARGET_BOTH:
case MOVE_TARGET_FOES_AND_ALLY:
@@ -273,7 +272,7 @@ static u8 sub_805D4A8(u16 move)
case MOVE_TARGET_DEPENDS:
case MOVE_TARGET_OPPONENTS_FIELD:
return 2;
case MOVE_TARGET_x10:
case MOVE_TARGET_USER:
return 1;
default:
return 0;

View File

@@ -81,7 +81,6 @@ extern struct MusicPlayerInfo gMPlayInfo_SE1;
extern struct MusicPlayerInfo gMPlayInfo_SE2;
extern u8 gUnknown_0203CF00[];
extern const struct BattleMove gBattleMoves[];
extern const u16 gBattleTextboxPalette[]; // battle textbox palette
extern const struct BgTemplate gUnknown_0831AA08[];
extern const struct WindowTemplate * const gUnknown_0831ABA0[];
@@ -301,6 +300,214 @@ u8 gNumberOfMovesToChoose;
u8 gUnknown_03005D7C[MAX_BATTLERS_COUNT];
// rom const data
// format: attacking type, defending type, damage multiplier
// the multiplier is a (decimal) fixed-point number:
// 20 is ×2.0 TYPE_MUL_SUPER_EFFECTIVE
// 10 is ×1.0 TYPE_MUL_NORMAL
// 05 is ×0.5 TYPE_MUL_NOT_EFFECTIVE
// 00 is ×0.0 TYPE_MUL_NO_EFFECT
const u8 gTypeEffectiveness[336] =
{
TYPE_NORMAL, TYPE_ROCK, TYPE_MUL_NOT_EFFECTIVE,
TYPE_NORMAL, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,
TYPE_FIRE, TYPE_FIRE, TYPE_MUL_NOT_EFFECTIVE,
TYPE_FIRE, TYPE_WATER, TYPE_MUL_NOT_EFFECTIVE,
TYPE_FIRE, TYPE_GRASS, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_FIRE, TYPE_ICE, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_FIRE, TYPE_BUG, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_FIRE, TYPE_ROCK, TYPE_MUL_NOT_EFFECTIVE,
TYPE_FIRE, TYPE_DRAGON, TYPE_MUL_NOT_EFFECTIVE,
TYPE_FIRE, TYPE_STEEL, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_WATER, TYPE_FIRE, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_WATER, TYPE_WATER, TYPE_MUL_NOT_EFFECTIVE,
TYPE_WATER, TYPE_GRASS, TYPE_MUL_NOT_EFFECTIVE,
TYPE_WATER, TYPE_GROUND, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_WATER, TYPE_ROCK, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_WATER, TYPE_DRAGON, TYPE_MUL_NOT_EFFECTIVE,
TYPE_ELECTRIC, TYPE_WATER, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_ELECTRIC, TYPE_ELECTRIC, TYPE_MUL_NOT_EFFECTIVE,
TYPE_ELECTRIC, TYPE_GRASS, TYPE_MUL_NOT_EFFECTIVE,
TYPE_ELECTRIC, TYPE_GROUND, TYPE_MUL_NO_EFFECT,
TYPE_ELECTRIC, TYPE_FLYING, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_ELECTRIC, TYPE_DRAGON, TYPE_MUL_NOT_EFFECTIVE,
TYPE_GRASS, TYPE_FIRE, TYPE_MUL_NOT_EFFECTIVE,
TYPE_GRASS, TYPE_WATER, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_GRASS, TYPE_GRASS, TYPE_MUL_NOT_EFFECTIVE,
TYPE_GRASS, TYPE_POISON, TYPE_MUL_NOT_EFFECTIVE,
TYPE_GRASS, TYPE_GROUND, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_GRASS, TYPE_FLYING, TYPE_MUL_NOT_EFFECTIVE,
TYPE_GRASS, TYPE_BUG, TYPE_MUL_NOT_EFFECTIVE,
TYPE_GRASS, TYPE_ROCK, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_GRASS, TYPE_DRAGON, TYPE_MUL_NOT_EFFECTIVE,
TYPE_GRASS, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,
TYPE_ICE, TYPE_WATER, TYPE_MUL_NOT_EFFECTIVE,
TYPE_ICE, TYPE_GRASS, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_ICE, TYPE_ICE, TYPE_MUL_NOT_EFFECTIVE,
TYPE_ICE, TYPE_GROUND, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_ICE, TYPE_FLYING, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_ICE, TYPE_DRAGON, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_ICE, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,
TYPE_ICE, TYPE_FIRE, TYPE_MUL_NOT_EFFECTIVE,
TYPE_FIGHTING, TYPE_NORMAL, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_FIGHTING, TYPE_ICE, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_FIGHTING, TYPE_POISON, TYPE_MUL_NOT_EFFECTIVE,
TYPE_FIGHTING, TYPE_FLYING, TYPE_MUL_NOT_EFFECTIVE,
TYPE_FIGHTING, TYPE_PSYCHIC, TYPE_MUL_NOT_EFFECTIVE,
TYPE_FIGHTING, TYPE_BUG, TYPE_MUL_NOT_EFFECTIVE,
TYPE_FIGHTING, TYPE_ROCK, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_FIGHTING, TYPE_DARK, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_FIGHTING, TYPE_STEEL, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_POISON, TYPE_GRASS, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_POISON, TYPE_POISON, TYPE_MUL_NOT_EFFECTIVE,
TYPE_POISON, TYPE_GROUND, TYPE_MUL_NOT_EFFECTIVE,
TYPE_POISON, TYPE_ROCK, TYPE_MUL_NOT_EFFECTIVE,
TYPE_POISON, TYPE_GHOST, TYPE_MUL_NOT_EFFECTIVE,
TYPE_POISON, TYPE_STEEL, TYPE_MUL_NO_EFFECT,
TYPE_GROUND, TYPE_FIRE, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_GROUND, TYPE_ELECTRIC, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_GROUND, TYPE_GRASS, TYPE_MUL_NOT_EFFECTIVE,
TYPE_GROUND, TYPE_POISON, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_GROUND, TYPE_FLYING, TYPE_MUL_NO_EFFECT,
TYPE_GROUND, TYPE_BUG, TYPE_MUL_NOT_EFFECTIVE,
TYPE_GROUND, TYPE_ROCK, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_GROUND, TYPE_STEEL, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_FLYING, TYPE_ELECTRIC, TYPE_MUL_NOT_EFFECTIVE,
TYPE_FLYING, TYPE_GRASS, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_FLYING, TYPE_FIGHTING, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_FLYING, TYPE_BUG, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_FLYING, TYPE_ROCK, TYPE_MUL_NOT_EFFECTIVE,
TYPE_FLYING, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,
TYPE_PSYCHIC, TYPE_FIGHTING, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_PSYCHIC, TYPE_POISON, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_PSYCHIC, TYPE_PSYCHIC, TYPE_MUL_NOT_EFFECTIVE,
TYPE_PSYCHIC, TYPE_DARK, TYPE_MUL_NO_EFFECT,
TYPE_PSYCHIC, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,
TYPE_BUG, TYPE_FIRE, TYPE_MUL_NOT_EFFECTIVE,
TYPE_BUG, TYPE_GRASS, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_BUG, TYPE_FIGHTING, TYPE_MUL_NOT_EFFECTIVE,
TYPE_BUG, TYPE_POISON, TYPE_MUL_NOT_EFFECTIVE,
TYPE_BUG, TYPE_FLYING, TYPE_MUL_NOT_EFFECTIVE,
TYPE_BUG, TYPE_PSYCHIC, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_BUG, TYPE_GHOST, TYPE_MUL_NOT_EFFECTIVE,
TYPE_BUG, TYPE_DARK, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_BUG, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,
TYPE_ROCK, TYPE_FIRE, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_ROCK, TYPE_ICE, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_ROCK, TYPE_FIGHTING, TYPE_MUL_NOT_EFFECTIVE,
TYPE_ROCK, TYPE_GROUND, TYPE_MUL_NOT_EFFECTIVE,
TYPE_ROCK, TYPE_FLYING, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_ROCK, TYPE_BUG, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_ROCK, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,
TYPE_GHOST, TYPE_NORMAL, TYPE_MUL_NO_EFFECT,
TYPE_GHOST, TYPE_PSYCHIC, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_GHOST, TYPE_DARK, TYPE_MUL_NOT_EFFECTIVE,
TYPE_GHOST, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,
TYPE_GHOST, TYPE_GHOST, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_DRAGON, TYPE_DRAGON, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_DRAGON, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,
TYPE_DARK, TYPE_FIGHTING, TYPE_MUL_NOT_EFFECTIVE,
TYPE_DARK, TYPE_PSYCHIC, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_DARK, TYPE_GHOST, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_DARK, TYPE_DARK, TYPE_MUL_NOT_EFFECTIVE,
TYPE_DARK, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,
TYPE_STEEL, TYPE_FIRE, TYPE_MUL_NOT_EFFECTIVE,
TYPE_STEEL, TYPE_WATER, TYPE_MUL_NOT_EFFECTIVE,
TYPE_STEEL, TYPE_ELECTRIC, TYPE_MUL_NOT_EFFECTIVE,
TYPE_STEEL, TYPE_ICE, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_STEEL, TYPE_ROCK, TYPE_MUL_SUPER_EFFECTIVE,
TYPE_STEEL, TYPE_STEEL, TYPE_MUL_NOT_EFFECTIVE,
TYPE_FORESIGHT, TYPE_FORESIGHT, TYPE_MUL_NO_EFFECT,
TYPE_NORMAL, TYPE_GHOST, TYPE_MUL_NO_EFFECT,
TYPE_FIGHTING, TYPE_GHOST, TYPE_MUL_NO_EFFECT,
TYPE_ENDTABLE, TYPE_ENDTABLE, TYPE_MUL_NO_EFFECT
};
const u8 gTypeNames[][TYPE_NAME_LENGTH + 1] =
{
_("NORMAL"),
_("FIGHT"),
_("FLYING"),
_("POISON"),
_("GROUND"),
_("ROCK"),
_("BUG"),
_("GHOST"),
_("STEEL"),
_("???"),
_("FIRE"),
_("WATER"),
_("GRASS"),
_("ELECTR"),
_("PSYCHC"),
_("ICE"),
_("DRAGON"),
_("DARK"),
};
// This is a factor in how much money you get for beating a trainer.
const struct TrainerMoney gTrainerMoneyTable[] =
{
{TRAINER_CLASS_TEAM_AQUA, 5},
{TRAINER_CLASS_AQUA_ADMIN, 10},
{TRAINER_CLASS_AQUA_LEADER, 20},
{TRAINER_CLASS_AROMA_LADY, 10},
{TRAINER_CLASS_RUIN_MANIAC, 15},
{TRAINER_CLASS_INTERVIEWER, 12},
{TRAINER_CLASS_TUBER_1, 1},
{TRAINER_CLASS_TUBER_2, 1},
{TRAINER_CLASS_SIS_AND_BRO, 3},
{TRAINER_CLASS_COOLTRAINER_1, 12},
{TRAINER_CLASS_HEX_MANIAC, 6},
{TRAINER_CLASS_LADY, 50},
{TRAINER_CLASS_BEAUTY, 20},
{TRAINER_CLASS_RICH_BOY, 50},
{TRAINER_CLASS_POKEMANIAC, 15},
{TRAINER_CLASS_SWIMMER_M, 2},
{TRAINER_CLASS_BLACK_BELT, 8},
{TRAINER_CLASS_GUITARIST, 8},
{TRAINER_CLASS_KINDLER, 8},
{TRAINER_CLASS_CAMPER, 4},
{TRAINER_CLASS_OLD_COUPLE, 10},
{TRAINER_CLASS_BUG_MANIAC, 15},
{TRAINER_CLASS_PSYCHIC, 6},
{TRAINER_CLASS_GENTLEMAN, 20},
{TRAINER_CLASS_ELITE_FOUR, 25},
{TRAINER_CLASS_LEADER, 25},
{TRAINER_CLASS_SCHOOL_KID, 5},
{TRAINER_CLASS_SR_AND_JR, 4},
{TRAINER_CLASS_POKEFAN, 20},
{TRAINER_CLASS_EXPERT, 10},
{TRAINER_CLASS_YOUNGSTER, 4},
{TRAINER_CLASS_CHAMPION, 50},
{TRAINER_CLASS_FISHERMAN, 10},
{TRAINER_CLASS_TRIATHLETE, 10},
{TRAINER_CLASS_DRAGON_TAMER, 12},
{TRAINER_CLASS_BIRD_KEEPER, 8},
{TRAINER_CLASS_NINJA_BOY, 3},
{TRAINER_CLASS_BATTLE_GIRL, 6},
{TRAINER_CLASS_PARASOL_LADY, 10},
{TRAINER_CLASS_SWIMMER_F, 2},
{TRAINER_CLASS_PICNICKER, 4},
{TRAINER_CLASS_TWINS, 3},
{TRAINER_CLASS_SAILOR, 8},
{TRAINER_CLASS_COLLECTOR, 15},
{TRAINER_CLASS_PKMN_TRAINER_3, 15},
{TRAINER_CLASS_PKMN_BREEDER, 10},
{TRAINER_CLASS_PKMN_RANGER, 12},
{TRAINER_CLASS_TEAM_MAGMA, 5},
{TRAINER_CLASS_MAGMA_ADMIN, 10},
{TRAINER_CLASS_MAGMA_LEADER, 20},
{TRAINER_CLASS_LASS, 4},
{TRAINER_CLASS_BUG_CATCHER, 4},
{TRAINER_CLASS_HIKER, 10},
{TRAINER_CLASS_YOUNG_COUPLE, 8},
{TRAINER_CLASS_WINSTRATE, 10},
{0xFF, 5},
};
#include "data/text/abilities.h"
static void (* const sTurnActionsFuncsTable[])(void) =
{
HandleAction_UseMove, // B_ACTION_USE_MOVE
@@ -5133,7 +5340,7 @@ static void HandleAction_UseMove(void)
else if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
&& gSideTimers[side].followmeTimer == 0
&& (gBattleMoves[gCurrentMove].power != 0
|| gBattleMoves[gCurrentMove].target != MOVE_TARGET_x10)
|| gBattleMoves[gCurrentMove].target != MOVE_TARGET_USER)
&& gBattleMons[*(gBattleStruct->moveTarget + gBattlerAttacker)].ability != ABILITY_LIGHTNING_ROD
&& gBattleMoves[gCurrentMove].type == TYPE_ELECTRIC)
{

View File

@@ -22,9 +22,7 @@ extern u8 gUnknown_0203C7B4;
extern struct StringInfoBattle *gStringInfo;
extern const u8 gMoveNames[LAST_MOVE_INDEX + 1][13];
extern const u8 gAbilityNames[][13];
extern const u8 gTrainerClassNames[][13];
extern const u8 gTypeNames[][7];
extern const u16 gUnknown_08D85620[];
// strings
@@ -516,375 +514,375 @@ const u8 gText_Trainer2LoseText[];
const u8 * const gBattleStringsTable[BATTLESTRINGS_COUNT] =
{
gText_Trainer1LoseText,
gText_PkmnGainedEXP,
gText_PkmnGrewToLv,
gText_PkmnLearnedMove,
gText_TryToLearnMove1,
gText_TryToLearnMove2,
gText_TryToLearnMove3,
gText_PkmnForgotMove,
gText_StopLearningMove,
gText_DidNotLearnMove,
gText_PkmnLearnedMove2,
gText_AttackMissed,
gText_PkmnProtectedItself,
gText_StatsWontIncrease2,
gText_AvoidedDamage,
gText_ItDoesntAffect,
gText_AttackerFainted,
gText_TargetFainted,
gText_PlayerGotMoney,
gText_PlayerWhiteout,
gText_PlayerWhiteout2,
gText_PreventsEscape,
gText_HitXTimes,
gText_PkmnFellAsleep,
gText_PkmnMadeSleep,
gText_PkmnAlreadyAsleep,
gText_PkmnAlreadyAsleep2,
gText_PkmnWasntAffected,
gText_PkmnWasPoisoned,
gText_PkmnPoisonedBy,
gText_PkmnHurtByPoison,
gText_PkmnAlreadyPoisoned,
gText_PkmnBadlyPoisoned,
gText_PkmnEnergyDrained,
gText_PkmnWasBurned,
gText_PkmnBurnedBy,
gText_PkmnHurtByBurn,
gText_PkmnWasFrozen,
gText_PkmnFrozenBy,
gText_PkmnIsFrozen,
gText_PkmnWasDefrosted,
gText_PkmnWasDefrosted2,
gText_PkmnWasDefrostedBy,
gText_PkmnWasParalyzed,
gText_PkmnWasParalyzedBy,
gText_PkmnIsParalyzed,
gText_PkmnIsAlreadyParalyzed,
gText_PkmnHealedParalysis,
gText_PkmnDreamEaten,
gText_StatsWontIncrease,
gText_StatsWontDecrease,
gText_TeamStoppedWorking,
gText_FoeStoppedWorking,
gText_PkmnIsConfused,
gText_PkmnHealedConfusion,
gText_PkmnWasConfused,
gText_PkmnAlreadyConfused,
gText_PkmnFellInLove,
gText_PkmnInLove,
gText_PkmnImmobilizedByLove,
gText_PkmnBlownAway,
gText_PkmnChangedType,
gText_PkmnFlinched,
gText_PkmnRegainedHealth,
gText_PkmnHPFull,
gText_PkmnRaisedSpDef,
gText_PkmnRaisedDef,
gText_PkmnCoveredByVeil,
gText_PkmnUsedSafeguard,
gText_PkmnSafeguardExpired,
gText_PkmnWentToSleep,
gText_PkmnSleptHealthy,
gText_PkmnWhippedWhirlwind,
gText_PkmnTookSunlight,
gText_PkmnLoweredHead,
gText_PkmnIsGlowing,
gText_PkmnFlewHigh,
gText_PkmnDugHole,
gText_PkmnSqueezedByBind,
gText_PkmnTrappedInVortex,
gText_PkmnWrappedBy,
gText_PkmnClamped,
gText_PkmnHurtBy,
gText_PkmnFreedFrom,
gText_PkmnCrashed,
gText_PkmnShroudedInMist,
gText_PkmnProtectedByMist,
gText_PkmnGettingPumped,
gText_PkmnHitWithRecoil,
gText_PkmnProtectedItself2,
gText_PkmnBuffetedBySandstorm,
gText_PkmnPeltedByHail,
gText_PkmnSeeded,
gText_PkmnEvadedAttack,
gText_PkmnSappedByLeechSeed,
gText_PkmnFastAsleep,
gText_PkmnWokeUp,
gText_PkmnUproarKeptAwake,
gText_PkmnWokeUpInUproar,
gText_PkmnCausedUproar,
gText_PkmnMakingUproar,
gText_PkmnCalmedDown,
gText_PkmnCantSleepInUproar,
gText_PkmnStockpiled,
gText_PkmnCantStockpile,
gText_PkmnCantSleepInUproar2,
gText_UproarKeptPkmnAwake,
gText_PkmnStayedAwakeUsing,
gText_PkmnStoringEnergy,
gText_PkmnUnleashedEnergy,
gText_PkmnFatigueConfusion,
gText_PkmnPickedUpItem,
gText_PkmnUnaffected,
gText_PkmnTransformedInto,
gText_PkmnMadeSubstitute,
gText_PkmnHasSubstitute,
gText_SubstituteDamaged,
gText_PkmnSubstituteFaded,
gText_PkmnMustRecharge,
gText_PkmnRageBuilding,
gText_PkmnMoveWasDisabled,
gText_PkmnMoveIsDisabled,
gText_PkmnMoveDisabledNoMore,
gText_PkmnGotEncore,
gText_PkmnEncoreEnded,
gText_PkmnTookAim,
gText_PkmnSketchedMove,
gText_PkmnTryingToTakeFoe,
gText_PkmnTookFoe,
gText_PkmnReducedPP,
gText_PkmnStoleItem,
gText_TargetCantEscapeNow,
gText_PkmnFellIntoNightmare,
gText_PkmnLockedInNightmare,
gText_PkmnLaidCurse,
gText_PkmnAfflictedByCurse,
gText_SpikesScattered,
gText_PkmnHurtBySpikes,
gText_PkmnIdentified,
gText_PkmnPerishCountFell,
gText_PkmnBracedItself,
gText_PkmnEnduredHit,
gText_MagnitudeStrength,
gText_PkmnCutHPMaxedAttack,
gText_PkmnCopiedStatChanges,
gText_PkmnGotFree,
gText_PkmnShedLeechSeed,
gText_PkmnBlewAwaySpikes,
gText_PkmnFledFromBattle,
gText_PkmnForesawAttack,
gText_PkmnTookAttack,
gText_PkmnAttack,
gText_PkmnCenterAttention,
gText_PkmnChargingPower,
gText_NaturePowerTurnedInto,
gText_PkmnStatusNormal,
gText_PkmnHasNoMovesLeft,
gText_PkmnSubjectedToTorment,
gText_PkmnCantUseMoveTorment,
gText_PkmnTighteningFocus,
gText_PkmnFellForTaunt,
gText_PkmnCantUseMoveTaunt,
gText_PkmnReadyToHelp,
gText_PkmnSwitchedItems,
gText_PkmnCopiedFoe,
gText_PkmnMadeWish,
gText_PkmnWishCameTrue,
gText_PkmnPlantedRoots,
gText_PkmnAbsorbedNutrients,
gText_PkmnAnchoredItself,
gText_PkmnWasMadeDrowsy,
gText_PkmnKnockedOff,
gText_PkmnSwappedAbilities,
gText_PkmnSealedOpponentMove,
gText_PkmnCantUseMoveSealed,
gText_PkmnWantsGrudge,
gText_PkmnLostPPGrudge,
gText_PkmnShroudedItself,
gText_PkmnMoveBounced,
gText_PkmnWaitsForTarget,
gText_PkmnSnatchedMove,
gText_PkmnMadeItRain,
gText_PkmnRaisedSpeed,
gText_PkmnProtectedBy,
gText_PkmnPreventsUsage,
gText_PkmnRestoredHPUsing,
gText_PkmnChangedTypeWith,
gText_PkmnPreventsParalysisWith,
gText_PkmnPreventsRomanceWith,
gText_PkmnPreventsPoisoningWith,
gText_PkmnPreventsConfusionWith,
gText_PkmnRaisedFirePowerWith,
gText_PkmnAnchorsItselfWith,
gText_PkmnCutsAttackWith,
gText_PkmnPreventsStatLossWith,
gText_PkmnHurtsWith,
gText_PkmnTraced,
gText_StatSharply,
gText_StatRose,
gText_StatHarshly,
gText_StatFell,
gText_PkmnsStatChanged,
gText_PkmnsStatChanged2,
gText_PkmnsStatChanged3,
gText_PkmnsStatChanged4,
gText_CriticalHit,
gText_OneHitKO,
gText_123Poof,
gText_AndEllipsis,
gText_NotVeryEffective,
gText_SuperEffective,
gText_GotAwaySafely,
gText_WildPkmnFled,
gText_NoRunningFromTrainers,
gText_CantEscape,
gText_DontLeaveBirch,
gText_ButNothingHappened,
gText_ButItFailed,
gText_ItHurtConfusion,
gText_MirrorMoveFailed,
gText_StartedToRain,
gText_DownpourStarted,
gText_RainContinues,
gText_DownpourContinues,
gText_RainStopped,
gText_SandstormBrewed,
gText_SandstormRages,
gText_SandstormSubsided,
gText_SunlightGotBright,
gText_SunlightStrong,
gText_SunlightFaded,
gText_StartedHail,
gText_HailContinues,
gText_HailStopped,
gText_FailedToSpitUp,
gText_FailedToSwallow,
gText_WindBecameHeatWave,
gText_StatChangesGone,
gText_CoinsScattered,
gText_TooWeakForSubstitute,
gText_SharedPain,
gText_BellChimed,
gText_FaintInThree,
gText_NoPPLeft,
gText_ButNoPPLeft,
gText_PlayerUsedItem,
gText_WallyUsedItem,
gText_TrainerBlockedBall,
gText_DontBeAThief,
gText_ItDodgedBall,
gText_YouMissedPkmn,
gText_PkmnBrokeFree,
gText_ItAppearedCaught,
gText_AarghAlmostHadIt,
gText_ShootSoClose,
gText_GotchaPkmnCaught,
gText_GotchaPkmnCaught2,
gText_GiveNicknameCaptured,
gText_PkmnSentToPC,
gText_PkmnDataAddedToDex,
gText_ItIsRaining,
gText_SandstormIsRaging,
gText_CantEscape2,
gText_PkmnIgnoresAsleep,
gText_PkmnIgnoredOrders,
gText_PkmnBeganToNap,
gText_PkmnLoafing,
gText_PkmnWontObey,
gText_PkmnTurnedAway,
gText_PkmnPretendNotNotice,
gText_EnemyAboutToSwitchPkmn,
gText_CreptCloser,
gText_CantGetCloser,
gText_PkmnWatchingCarefully,
gText_PkmnCuriousAboutX,
gText_PkmnEnthralledByX,
gText_PkmnIgnoredX,
gText_ThrewPokeblockAtPkmn,
gText_OutOfSafariBalls,
gText_PkmnsItemCuredParalysis,
gText_PkmnsItemCuredPoison,
gText_PkmnsItemHealedBurn,
gText_PkmnsItemDefrostedIt,
gText_PkmnsItemWokeIt,
gText_PkmnsItemSnappedOut,
gText_PkmnsItemCuredProblem,
gText_PkmnsItemRestoredHealth,
gText_PkmnsItemRestoredPP,
gText_PkmnsItemRestoredStatus,
gText_PkmnsItemRestoredHPALittle,
gText_ItemAllowsOnlyYMove,
gText_PkmnHungOnWithX,
gText_EmptyString3,
gText_PkmnsXPreventsBurns,
gText_PkmnsXBlocksY,
gText_PkmnsXRestoredHPALittle2,
gText_PkmnsXWhippedUpSandstorm,
gText_PkmnsXPreventsYLoss,
gText_PkmnsXInfatuatedY,
gText_PkmnsXMadeYIneffective,
gText_PkmnsXCuredYProblem,
gText_ItSuckedLiquidOoze,
gText_PkmnTransformed,
gText_ElectricityWeakened,
gText_FireWeakened,
gText_PkmnHidUnderwater,
gText_PkmnSprangUp,
gText_HMMovesCantBeForgotten,
gText_XFoundOneY,
gText_PlayerDefeatedLinkTrainerTrainer1,
gText_SoothingAroma,
gText_ItemsCantBeUsedNow,
gText_ForXCommaYZ,
gText_UsingXTheYOfZN,
gText_PkmnUsedXToGetPumped,
gText_PkmnsXMadeYUseless,
gText_PkmnTrappedBySandTomb,
gText_EmptyString4,
gText_ABoosted,
gText_PkmnsXIntensifiedSun,
gText_PkmnMakesGroundMiss,
gText_YouThrowABallNowRight,
gText_PkmnsXTookAttack,
gText_PkmnChoseXAsDestiny,
gText_PkmnLostFocus,
gText_UseNextPkmn,
gText_PkmnFledUsingIts,
gText_PkmnFledUsing,
gText_PkmnWasDraggedOut,
gText_PreventedFromWorking,
gText_PkmnsItemNormalizedStatus,
gText_Trainer1UsedItem,
gText_BoxIsFull,
gText_PkmnAvoidedAttack,
gText_PkmnsXMadeItIneffective,
gText_PkmnsXPreventsFlinching,
gText_PkmnAlreadyHasBurn,
gText_StatsWontDecrease2,
gText_PkmnsXBlocksY2,
gText_PkmnsXWoreOff,
gText_PkmnRaisedDefALittle,
gText_PkmnRaisedSpDefALittle,
gText_TheWallShattered,
gText_PkmnsXPreventsYsZ,
gText_PkmnsXCuredItsYProblem,
gText_AttackerCantEscape,
gText_PkmnObtainedX,
gText_PkmnObtainedX2,
gText_PkmnObtainedXYObtainedZ,
gText_ButNoEffect,
gText_PkmnsXHadNoEffectOnY,
gText_TwoInGameTrainersDefeated,
gText_Trainer2LoseText,
gText_PkmnIncapableOfPower,
gText_GlintAppearsInEye,
gText_PkmnGettingIntoPosition,
gText_PkmnBeganGrowlingDeeply,
gText_PkmnEagerForMore,
gText_DefeatedOpponentByReferee,
gText_LostToOpponentByReferee,
gText_TiedOpponentByReferee,
gText_QuestionForfeitMatch,
gText_ForfeitedMatch,
gText_PkmnTransferredSomeonesPC,
gText_PkmnTransferredLanettesPC,
gText_PkmnBoxSomeonesPCFull,
gText_PkmnBoxLanettesPCFull,
gText_Trainer1WinText,
gText_Trainer2WinText,
gText_Trainer1LoseText, // 12
gText_PkmnGainedEXP, // 13
gText_PkmnGrewToLv, // 14
gText_PkmnLearnedMove, // 15
gText_TryToLearnMove1, // 16
gText_TryToLearnMove2, // 17
gText_TryToLearnMove3, // 18
gText_PkmnForgotMove, // 19
gText_StopLearningMove, // 20
gText_DidNotLearnMove, // 21
gText_PkmnLearnedMove2, // 22
gText_AttackMissed, // 23
gText_PkmnProtectedItself, // 24
gText_StatsWontIncrease2, // 25
gText_AvoidedDamage, // 26
gText_ItDoesntAffect, // 27
gText_AttackerFainted, // 28
gText_TargetFainted, // 29
gText_PlayerGotMoney, // 30
gText_PlayerWhiteout, // 31
gText_PlayerWhiteout2, // 32
gText_PreventsEscape, // 33
gText_HitXTimes, // 34
gText_PkmnFellAsleep, // 35
gText_PkmnMadeSleep, // 36
gText_PkmnAlreadyAsleep, // 37
gText_PkmnAlreadyAsleep2, // 38
gText_PkmnWasntAffected, // 39
gText_PkmnWasPoisoned, // 40
gText_PkmnPoisonedBy, // 41
gText_PkmnHurtByPoison, // 42
gText_PkmnAlreadyPoisoned, // 43
gText_PkmnBadlyPoisoned, // 44
gText_PkmnEnergyDrained, // 45
gText_PkmnWasBurned, // 46
gText_PkmnBurnedBy, // 47
gText_PkmnHurtByBurn, // 48
gText_PkmnWasFrozen, // 49
gText_PkmnFrozenBy, // 50
gText_PkmnIsFrozen, // 51
gText_PkmnWasDefrosted, // 52
gText_PkmnWasDefrosted2, // 53
gText_PkmnWasDefrostedBy, // 54
gText_PkmnWasParalyzed, // 55
gText_PkmnWasParalyzedBy, // 56
gText_PkmnIsParalyzed, // 57
gText_PkmnIsAlreadyParalyzed, // 58
gText_PkmnHealedParalysis, // 59
gText_PkmnDreamEaten, // 60
gText_StatsWontIncrease, // 61
gText_StatsWontDecrease, // 62
gText_TeamStoppedWorking, // 63
gText_FoeStoppedWorking, // 64
gText_PkmnIsConfused, // 65
gText_PkmnHealedConfusion, // 66
gText_PkmnWasConfused, // 67
gText_PkmnAlreadyConfused, // 68
gText_PkmnFellInLove, // 69
gText_PkmnInLove, // 70
gText_PkmnImmobilizedByLove, // 71
gText_PkmnBlownAway, // 72
gText_PkmnChangedType, // 73
gText_PkmnFlinched, // 74
gText_PkmnRegainedHealth, // 75
gText_PkmnHPFull, // 76
gText_PkmnRaisedSpDef, // 77
gText_PkmnRaisedDef, // 78
gText_PkmnCoveredByVeil, // 79
gText_PkmnUsedSafeguard, // 80
gText_PkmnSafeguardExpired, // 81
gText_PkmnWentToSleep, // 82
gText_PkmnSleptHealthy, // 83
gText_PkmnWhippedWhirlwind, // 84
gText_PkmnTookSunlight, // 85
gText_PkmnLoweredHead, // 86
gText_PkmnIsGlowing, // 87
gText_PkmnFlewHigh, // 88
gText_PkmnDugHole, // 89
gText_PkmnSqueezedByBind, // 90
gText_PkmnTrappedInVortex, // 91
gText_PkmnWrappedBy, // 92
gText_PkmnClamped, // 93
gText_PkmnHurtBy, // 94
gText_PkmnFreedFrom, // 95
gText_PkmnCrashed, // 96
gText_PkmnShroudedInMist, // 97
gText_PkmnProtectedByMist, // 98
gText_PkmnGettingPumped, // 99
gText_PkmnHitWithRecoil, // 100
gText_PkmnProtectedItself2, // 101
gText_PkmnBuffetedBySandstorm, // 102
gText_PkmnPeltedByHail, // 103
gText_PkmnSeeded, // 104
gText_PkmnEvadedAttack, // 105
gText_PkmnSappedByLeechSeed, // 106
gText_PkmnFastAsleep, // 107
gText_PkmnWokeUp, // 108
gText_PkmnUproarKeptAwake, // 109
gText_PkmnWokeUpInUproar, // 110
gText_PkmnCausedUproar, // 111
gText_PkmnMakingUproar, // 112
gText_PkmnCalmedDown, // 113
gText_PkmnCantSleepInUproar, // 114
gText_PkmnStockpiled, // 115
gText_PkmnCantStockpile, // 116
gText_PkmnCantSleepInUproar2, // 117
gText_UproarKeptPkmnAwake, // 118
gText_PkmnStayedAwakeUsing, // 119
gText_PkmnStoringEnergy, // 120
gText_PkmnUnleashedEnergy, // 121
gText_PkmnFatigueConfusion, // 122
gText_PkmnPickedUpItem, // 123
gText_PkmnUnaffected, // 124
gText_PkmnTransformedInto, // 125
gText_PkmnMadeSubstitute, // 126
gText_PkmnHasSubstitute, // 127
gText_SubstituteDamaged, // 128
gText_PkmnSubstituteFaded, // 129
gText_PkmnMustRecharge, // 130
gText_PkmnRageBuilding, // 131
gText_PkmnMoveWasDisabled, // 132
gText_PkmnMoveIsDisabled, // 133
gText_PkmnMoveDisabledNoMore, // 134
gText_PkmnGotEncore, // 135
gText_PkmnEncoreEnded, // 136
gText_PkmnTookAim, // 137
gText_PkmnSketchedMove, // 138
gText_PkmnTryingToTakeFoe, // 139
gText_PkmnTookFoe, // 140
gText_PkmnReducedPP, // 141
gText_PkmnStoleItem, // 142
gText_TargetCantEscapeNow, // 143
gText_PkmnFellIntoNightmare, // 144
gText_PkmnLockedInNightmare, // 145
gText_PkmnLaidCurse, // 146
gText_PkmnAfflictedByCurse, // 147
gText_SpikesScattered, // 148
gText_PkmnHurtBySpikes, // 149
gText_PkmnIdentified, // 150
gText_PkmnPerishCountFell, // 151
gText_PkmnBracedItself, // 152
gText_PkmnEnduredHit, // 153
gText_MagnitudeStrength, // 154
gText_PkmnCutHPMaxedAttack, // 155
gText_PkmnCopiedStatChanges, // 156
gText_PkmnGotFree, // 157
gText_PkmnShedLeechSeed, // 158
gText_PkmnBlewAwaySpikes, // 159
gText_PkmnFledFromBattle, // 160
gText_PkmnForesawAttack, // 161
gText_PkmnTookAttack, // 162
gText_PkmnAttack, // 163
gText_PkmnCenterAttention, // 164
gText_PkmnChargingPower, // 165
gText_NaturePowerTurnedInto, // 166
gText_PkmnStatusNormal, // 167
gText_PkmnHasNoMovesLeft, // 168
gText_PkmnSubjectedToTorment, // 169
gText_PkmnCantUseMoveTorment, // 170
gText_PkmnTighteningFocus, // 171
gText_PkmnFellForTaunt, // 172
gText_PkmnCantUseMoveTaunt, // 173
gText_PkmnReadyToHelp, // 174
gText_PkmnSwitchedItems, // 175
gText_PkmnCopiedFoe, // 176
gText_PkmnMadeWish, // 177
gText_PkmnWishCameTrue, // 178
gText_PkmnPlantedRoots, // 179
gText_PkmnAbsorbedNutrients, // 180
gText_PkmnAnchoredItself, // 181
gText_PkmnWasMadeDrowsy, // 182
gText_PkmnKnockedOff, // 183
gText_PkmnSwappedAbilities, // 184
gText_PkmnSealedOpponentMove, // 185
gText_PkmnCantUseMoveSealed, // 186
gText_PkmnWantsGrudge, // 187
gText_PkmnLostPPGrudge, // 188
gText_PkmnShroudedItself, // 189
gText_PkmnMoveBounced, // 190
gText_PkmnWaitsForTarget, // 191
gText_PkmnSnatchedMove, // 192
gText_PkmnMadeItRain, // 193
gText_PkmnRaisedSpeed, // 194
gText_PkmnProtectedBy, // 195
gText_PkmnPreventsUsage, // 196
gText_PkmnRestoredHPUsing, // 197
gText_PkmnChangedTypeWith, // 198
gText_PkmnPreventsParalysisWith, // 199
gText_PkmnPreventsRomanceWith, // 200
gText_PkmnPreventsPoisoningWith, // 201
gText_PkmnPreventsConfusionWith, // 202
gText_PkmnRaisedFirePowerWith, // 203
gText_PkmnAnchorsItselfWith, // 204
gText_PkmnCutsAttackWith, // 205
gText_PkmnPreventsStatLossWith, // 206
gText_PkmnHurtsWith, // 207
gText_PkmnTraced, // 208
gText_StatSharply, // 209
gText_StatRose, // 210
gText_StatHarshly, // 211
gText_StatFell, // 212
gText_PkmnsStatChanged, // 213
gText_PkmnsStatChanged2, // 214
gText_PkmnsStatChanged3, // 215
gText_PkmnsStatChanged4, // 216
gText_CriticalHit, // 217
gText_OneHitKO, // 218
gText_123Poof, // 219
gText_AndEllipsis, // 220
gText_NotVeryEffective, // 221
gText_SuperEffective, // 222
gText_GotAwaySafely, // 223
gText_WildPkmnFled, // 224
gText_NoRunningFromTrainers, // 225
gText_CantEscape, // 226
gText_DontLeaveBirch, // 227
gText_ButNothingHappened, // 228
gText_ButItFailed, // 229
gText_ItHurtConfusion, // 230
gText_MirrorMoveFailed, // 231
gText_StartedToRain, // 232
gText_DownpourStarted, // 233
gText_RainContinues, // 234
gText_DownpourContinues, // 235
gText_RainStopped, // 236
gText_SandstormBrewed, // 237
gText_SandstormRages, // 238
gText_SandstormSubsided, // 239
gText_SunlightGotBright, // 240
gText_SunlightStrong, // 241
gText_SunlightFaded, // 242
gText_StartedHail, // 243
gText_HailContinues, // 244
gText_HailStopped, // 245
gText_FailedToSpitUp, // 246
gText_FailedToSwallow, // 247
gText_WindBecameHeatWave, // 248
gText_StatChangesGone, // 249
gText_CoinsScattered, // 250
gText_TooWeakForSubstitute, // 251
gText_SharedPain, // 252
gText_BellChimed, // 253
gText_FaintInThree, // 254
gText_NoPPLeft, // 255
gText_ButNoPPLeft, // 256
gText_PlayerUsedItem, // 257
gText_WallyUsedItem, // 258
gText_TrainerBlockedBall, // 259
gText_DontBeAThief, // 260
gText_ItDodgedBall, // 261
gText_YouMissedPkmn, // 262
gText_PkmnBrokeFree, // 263
gText_ItAppearedCaught, // 264
gText_AarghAlmostHadIt, // 265
gText_ShootSoClose, // 266
gText_GotchaPkmnCaught, // 267
gText_GotchaPkmnCaught2, // 268
gText_GiveNicknameCaptured, // 269
gText_PkmnSentToPC, // 270
gText_PkmnDataAddedToDex, // 271
gText_ItIsRaining, // 272
gText_SandstormIsRaging, // 273
gText_CantEscape2, // 274
gText_PkmnIgnoresAsleep, // 275
gText_PkmnIgnoredOrders, // 276
gText_PkmnBeganToNap, // 277
gText_PkmnLoafing, // 278
gText_PkmnWontObey, // 279
gText_PkmnTurnedAway, // 280
gText_PkmnPretendNotNotice, // 281
gText_EnemyAboutToSwitchPkmn, // 282
gText_CreptCloser, // 283
gText_CantGetCloser, // 284
gText_PkmnWatchingCarefully, // 285
gText_PkmnCuriousAboutX, // 286
gText_PkmnEnthralledByX, // 287
gText_PkmnIgnoredX, // 288
gText_ThrewPokeblockAtPkmn, // 289
gText_OutOfSafariBalls, // 290
gText_PkmnsItemCuredParalysis, // 291
gText_PkmnsItemCuredPoison, // 292
gText_PkmnsItemHealedBurn, // 293
gText_PkmnsItemDefrostedIt, // 294
gText_PkmnsItemWokeIt, // 295
gText_PkmnsItemSnappedOut, // 296
gText_PkmnsItemCuredProblem, // 297
gText_PkmnsItemRestoredHealth, // 298
gText_PkmnsItemRestoredPP, // 299
gText_PkmnsItemRestoredStatus, // 300
gText_PkmnsItemRestoredHPALittle, // 301
gText_ItemAllowsOnlyYMove, // 302
gText_PkmnHungOnWithX, // 303
gText_EmptyString3, // 304
gText_PkmnsXPreventsBurns, // 305
gText_PkmnsXBlocksY, // 306
gText_PkmnsXRestoredHPALittle2, // 307
gText_PkmnsXWhippedUpSandstorm, // 308
gText_PkmnsXPreventsYLoss, // 309
gText_PkmnsXInfatuatedY, // 310
gText_PkmnsXMadeYIneffective, // 311
gText_PkmnsXCuredYProblem, // 312
gText_ItSuckedLiquidOoze, // 313
gText_PkmnTransformed, // 314
gText_ElectricityWeakened, // 315
gText_FireWeakened, // 316
gText_PkmnHidUnderwater, // 317
gText_PkmnSprangUp, // 318
gText_HMMovesCantBeForgotten, // 319
gText_XFoundOneY, // 320
gText_PlayerDefeatedLinkTrainerTrainer1, // 321
gText_SoothingAroma, // 322
gText_ItemsCantBeUsedNow, // 323
gText_ForXCommaYZ, // 324
gText_UsingXTheYOfZN, // 325
gText_PkmnUsedXToGetPumped, // 326
gText_PkmnsXMadeYUseless, // 327
gText_PkmnTrappedBySandTomb, // 328
gText_EmptyString4, // 329
gText_ABoosted, // 330
gText_PkmnsXIntensifiedSun, // 331
gText_PkmnMakesGroundMiss, // 332
gText_YouThrowABallNowRight, // 333
gText_PkmnsXTookAttack, // 334
gText_PkmnChoseXAsDestiny, // 335
gText_PkmnLostFocus, // 336
gText_UseNextPkmn, // 337
gText_PkmnFledUsingIts, // 338
gText_PkmnFledUsing, // 339
gText_PkmnWasDraggedOut, // 340
gText_PreventedFromWorking, // 341
gText_PkmnsItemNormalizedStatus, // 342
gText_Trainer1UsedItem, // 343
gText_BoxIsFull, // 344
gText_PkmnAvoidedAttack, // 345
gText_PkmnsXMadeItIneffective, // 346
gText_PkmnsXPreventsFlinching, // 347
gText_PkmnAlreadyHasBurn, // 348
gText_StatsWontDecrease2, // 349
gText_PkmnsXBlocksY2, // 350
gText_PkmnsXWoreOff, // 351
gText_PkmnRaisedDefALittle, // 352
gText_PkmnRaisedSpDefALittle, // 353
gText_TheWallShattered, // 354
gText_PkmnsXPreventsYsZ, // 355
gText_PkmnsXCuredItsYProblem, // 356
gText_AttackerCantEscape, // 357
gText_PkmnObtainedX, // 358
gText_PkmnObtainedX2, // 359
gText_PkmnObtainedXYObtainedZ, // 360
gText_ButNoEffect, // 361
gText_PkmnsXHadNoEffectOnY, // 362
gText_TwoInGameTrainersDefeated, // 363
gText_Trainer2LoseText, // 364
gText_PkmnIncapableOfPower, // 365
gText_GlintAppearsInEye, // 366
gText_PkmnGettingIntoPosition, // 367
gText_PkmnBeganGrowlingDeeply, // 368
gText_PkmnEagerForMore, // 369
gText_DefeatedOpponentByReferee, // 370
gText_LostToOpponentByReferee, // 371
gText_TiedOpponentByReferee, // 372
gText_QuestionForfeitMatch, // 373
gText_ForfeitedMatch, // 374
gText_PkmnTransferredSomeonesPC, // 375
gText_PkmnTransferredLanettesPC, // 376
gText_PkmnBoxSomeonesPCFull, // 377
gText_PkmnBoxLanettesPCFull, // 378
gText_Trainer1WinText, // 379
gText_Trainer2WinText, // 380
};
const u16 gMissStringIds[] =

View File

@@ -48,15 +48,6 @@ extern u16 gBattle_BG2_Y;
extern u16 gBattle_BG3_X;
extern struct MusicPlayerInfo gMPlayInfo_BGM;
struct TrainerMoney
{
u8 classId;
u8 value;
};
extern const struct BattleMove gBattleMoves[];
extern const u8 gTypeEffectiveness[336];
extern const struct TrainerMoney gTrainerMoneyTable[];
extern const u8* const gBattleScriptsForMoveEffects[];
// functions
@@ -4436,31 +4427,34 @@ static void atk47_setgraphicalstatchangevalues(void)
gBattlescriptCurrInstr++;
}
#ifdef NONMATCHING
static void atk48_playstatchangeanimation(void)
{
u32 currStat = 0;
s16 statAnimId = 0;
s16 checkingStatAnimId = 0;
s32 changeableStats = 0;
u32 statsToCheck = 0;
u16 statAnimId = 0;
s32 changeableStatsCount = 0;
u8 statsToCheck = 0;
gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]);
statsToCheck = gBattlescriptCurrInstr[2];
if (gBattlescriptCurrInstr[3] & ATK48_STAT_NEGATIVE) // goes down
{
checkingStatAnimId = (gBattlescriptCurrInstr[3] & ATK48_STAT_BY_TWO) ? 0x2D : 0x15;
s16 startingStatAnimId;
if (gBattlescriptCurrInstr[3] & ATK48_STAT_BY_TWO)
startingStatAnimId = 0x2D;
else
startingStatAnimId = 0x15;
while (statsToCheck != 0)
{
if (statsToCheck & 1)
{
if (!(gBattlescriptCurrInstr[3] & ATK48_LOWER_FAIL_CHECK))
if (gBattlescriptCurrInstr[3] & ATK48_DONT_CHECK_LOWER)
{
if (gBattleMons[gActiveBattler].statStages[currStat] > 0)
{
statAnimId = checkingStatAnimId;
changeableStats++;
statAnimId = startingStatAnimId + currStat;
changeableStatsCount++;
}
}
else if (!gSideTimers[GET_BATTLER_SIDE(gActiveBattler)].mistTimer
@@ -4471,15 +4465,15 @@ static void atk48_playstatchangeanimation(void)
{
if (gBattleMons[gActiveBattler].statStages[currStat] > 0)
{
statAnimId = checkingStatAnimId;
changeableStats++;
statAnimId = startingStatAnimId + currStat;
changeableStatsCount++;
}
}
}
statsToCheck >>= 1, checkingStatAnimId++, currStat++;
statsToCheck >>= 1, currStat++;
}
if (changeableStats > 1) // more than one stat, so the color is gray
if (changeableStatsCount > 1) // more than one stat, so the color is gray
{
if (gBattlescriptCurrInstr[3] & ATK48_STAT_BY_TWO)
statAnimId = 0x3A;
@@ -4489,18 +4483,23 @@ static void atk48_playstatchangeanimation(void)
}
else // goes up
{
checkingStatAnimId = (gBattlescriptCurrInstr[3] & ATK48_STAT_BY_TWO) ? 0x26 : 0xE;
s16 startingStatAnimId;
if (gBattlescriptCurrInstr[3] & ATK48_STAT_BY_TWO)
startingStatAnimId = 0x26;
else
startingStatAnimId = 0xE;
while (statsToCheck != 0)
{
if (statsToCheck & 1 && gBattleMons[gActiveBattler].statStages[currStat] < 0xC)
{
statAnimId = checkingStatAnimId;
changeableStats++;
statAnimId = startingStatAnimId + currStat;
changeableStatsCount++;
}
statsToCheck >>= 1, checkingStatAnimId += 1, currStat++;
statsToCheck >>= 1, currStat++;
}
if (changeableStats > 1) // more than one stat, so the color is gray
if (changeableStatsCount > 1) // more than one stat, so the color is gray
{
if (gBattlescriptCurrInstr[3] & ATK48_STAT_BY_TWO)
statAnimId = 0x38;
@@ -4509,15 +4508,15 @@ static void atk48_playstatchangeanimation(void)
}
}
if (gBattlescriptCurrInstr[3] & ATK48_BIT_x4 && changeableStats < 2)
if (gBattlescriptCurrInstr[3] & ATK48_BIT_x4 && changeableStatsCount < 2)
{
gBattlescriptCurrInstr += 4;
}
else if (changeableStats != 0 && gBattleScripting.field_1B == 0)
else if (changeableStatsCount != 0 && gBattleScripting.field_1B == 0)
{
BtlController_EmitBattleAnimation(0, B_ANIM_STATS_CHANGE, statAnimId);
MarkBattlerForControllerExec(gActiveBattler);
if (gBattlescriptCurrInstr[3] & ATK48_BIT_x4 && changeableStats > 1)
if (gBattlescriptCurrInstr[3] & ATK48_BIT_x4 && changeableStatsCount > 1)
gBattleScripting.field_1B = 1;
gBattlescriptCurrInstr += 4;
}
@@ -4526,261 +4525,6 @@ static void atk48_playstatchangeanimation(void)
gBattlescriptCurrInstr += 4;
}
}
#else
ASM_DIRECT
static void atk48_playstatchangeanimation(void)
{
asm("\n\
.syntax unified\n\
push {r4-r7,lr}\n\
mov r7, r10\n\
mov r6, r9\n\
mov r5, r8\n\
push {r5-r7}\n\
sub sp, 0x4\n\
movs r7, 0\n\
movs r0, 0\n\
mov r8, r0\n\
movs r3, 0\n\
ldr r5, =gBattlescriptCurrInstr\n\
ldr r0, [r5]\n\
ldrb r0, [r0, 0x1]\n\
str r3, [sp]\n\
bl GetBattlerForBattleScript\n\
ldr r2, =gActiveBattler\n\
strb r0, [r2]\n\
ldr r0, [r5]\n\
ldrb r4, [r0, 0x2]\n\
ldrb r1, [r0, 0x3]\n\
movs r0, 0x1\n\
ands r0, r1\n\
ldr r3, [sp]\n\
cmp r0, 0\n\
beq _0804BAEC\n\
movs r0, 0x2\n\
ands r0, r1\n\
movs r1, 0x15\n\
cmp r0, 0\n\
beq _0804BA18\n\
movs r1, 0x2D\n\
_0804BA18:\n\
cmp r4, 0\n\
beq _0804BAC0\n\
movs r0, 0x1\n\
mov r10, r0\n\
ldr r0, =gBattleMons + 0x18\n\
mov r9, r0\n\
lsls r5, r1, 16\n\
_0804BA26:\n\
adds r0, r4, 0\n\
mov r1, r10\n\
ands r0, r1\n\
cmp r0, 0\n\
beq _0804BAB2\n\
ldr r0, =gBattlescriptCurrInstr\n\
ldr r0, [r0]\n\
ldrb r1, [r0, 0x3]\n\
movs r0, 0x8\n\
ands r0, r1\n\
cmp r0, 0\n\
beq _0804BA58\n\
ldr r0, =gActiveBattler\n\
ldrb r1, [r0]\n\
movs r0, 0x58\n\
muls r0, r1\n\
adds r0, r7, r0\n\
b _0804BAA0\n\
.pool\n\
_0804BA58:\n\
ldr r6, =gActiveBattler\n\
ldrb r0, [r6]\n\
str r3, [sp]\n\
bl GetBattlerPosition\n\
mov r1, r10\n\
ands r1, r0\n\
lsls r0, r1, 1\n\
adds r0, r1\n\
lsls r0, 2\n\
ldr r1, =gSideTimers\n\
adds r0, r1\n\
ldrb r0, [r0, 0x4]\n\
ldr r3, [sp]\n\
cmp r0, 0\n\
bne _0804BAB2\n\
ldr r0, =gBattleMons\n\
ldrb r2, [r6]\n\
movs r1, 0x58\n\
muls r2, r1\n\
adds r0, r2, r0\n\
adds r0, 0x20\n\
ldrb r0, [r0]\n\
cmp r0, 0x1D\n\
beq _0804BAB2\n\
cmp r0, 0x49\n\
beq _0804BAB2\n\
cmp r0, 0x33\n\
bne _0804BA96\n\
cmp r7, 0x6\n\
beq _0804BAB2\n\
_0804BA96:\n\
cmp r0, 0x34\n\
bne _0804BA9E\n\
cmp r7, 0x1\n\
beq _0804BAB2\n\
_0804BA9E:\n\
adds r0, r7, r2\n\
_0804BAA0:\n\
add r0, r9\n\
ldrb r0, [r0]\n\
lsls r0, 24\n\
asrs r0, 24\n\
cmp r0, 0\n\
ble _0804BAB2\n\
lsrs r0, r5, 16\n\
mov r8, r0\n\
adds r3, 0x1\n\
_0804BAB2:\n\
lsrs r4, 1\n\
movs r1, 0x80\n\
lsls r1, 9\n\
adds r5, r1\n\
adds r7, 0x1\n\
cmp r4, 0\n\
bne _0804BA26\n\
_0804BAC0:\n\
ldr r0, =gBattlescriptCurrInstr\n\
mov r9, r0\n\
cmp r3, 0x1\n\
ble _0804BB4E\n\
ldr r0, [r0]\n\
ldrb r1, [r0, 0x3]\n\
movs r0, 0x2\n\
ands r0, r1\n\
movs r1, 0x39\n\
mov r8, r1\n\
cmp r0, 0\n\
beq _0804BB4E\n\
movs r0, 0x3A\n\
b _0804BB4C\n\
.pool\n\
_0804BAEC:\n\
movs r0, 0x2\n\
ands r0, r1\n\
movs r1, 0xE\n\
cmp r0, 0\n\
beq _0804BAF8\n\
movs r1, 0x26\n\
_0804BAF8:\n\
mov r9, r5\n\
cmp r4, 0\n\
beq _0804BB34\n\
ldr r6, =gBattleMons + 0x18\n\
adds r5, r2, 0\n\
lsls r2, r1, 16\n\
_0804BB04:\n\
movs r0, 0x1\n\
ands r0, r4\n\
cmp r0, 0\n\
beq _0804BB26\n\
ldrb r1, [r5]\n\
movs r0, 0x58\n\
muls r0, r1\n\
adds r0, r7, r0\n\
adds r0, r6\n\
ldrb r0, [r0]\n\
lsls r0, 24\n\
asrs r0, 24\n\
cmp r0, 0xB\n\
bgt _0804BB26\n\
lsrs r1, r2, 16\n\
mov r8, r1\n\
adds r3, 0x1\n\
_0804BB26:\n\
lsrs r4, 1\n\
movs r0, 0x80\n\
lsls r0, 9\n\
adds r2, r0\n\
adds r7, 0x1\n\
cmp r4, 0\n\
bne _0804BB04\n\
_0804BB34:\n\
cmp r3, 0x1\n\
ble _0804BB4E\n\
mov r1, r9\n\
ldr r0, [r1]\n\
ldrb r1, [r0, 0x3]\n\
movs r0, 0x2\n\
ands r0, r1\n\
movs r1, 0x37\n\
mov r8, r1\n\
cmp r0, 0\n\
beq _0804BB4E\n\
movs r0, 0x38\n\
_0804BB4C:\n\
mov r8, r0\n\
_0804BB4E:\n\
mov r1, r9\n\
ldr r2, [r1]\n\
ldrb r1, [r2, 0x3]\n\
movs r0, 0x4\n\
ands r0, r1\n\
cmp r0, 0\n\
beq _0804BB6C\n\
cmp r3, 0x1\n\
bgt _0804BB6C\n\
adds r0, r2, 0x4\n\
mov r1, r9\n\
b _0804BBBA\n\
.pool\n\
_0804BB6C:\n\
cmp r3, 0\n\
beq _0804BBB4\n\
ldr r4, =gBattleScripting\n\
ldrb r0, [r4, 0x1B]\n\
cmp r0, 0\n\
bne _0804BBB4\n\
movs r0, 0\n\
movs r1, 0x1\n\
mov r2, r8\n\
str r3, [sp]\n\
bl BtlController_EmitBattleAnimation\n\
ldr r0, =gActiveBattler\n\
ldrb r0, [r0]\n\
bl MarkBattlerForControllerExec\n\
ldr r0, =gBattlescriptCurrInstr\n\
ldr r0, [r0]\n\
ldrb r1, [r0, 0x3]\n\
movs r0, 0x4\n\
ands r0, r1\n\
ldr r3, [sp]\n\
cmp r0, 0\n\
beq _0804BBA4\n\
cmp r3, 0x1\n\
ble _0804BBA4\n\
movs r0, 0x1\n\
strb r0, [r4, 0x1B]\n\
_0804BBA4:\n\
ldr r1, =gBattlescriptCurrInstr\n\
b _0804BBB6\n\
.pool\n\
_0804BBB4:\n\
mov r1, r9\n\
_0804BBB6:\n\
ldr r0, [r1]\n\
adds r0, 0x4\n\
_0804BBBA:\n\
str r0, [r1]\n\
add sp, 0x4\n\
pop {r3-r5}\n\
mov r8, r3\n\
mov r9, r4\n\
mov r10, r5\n\
pop {r4-r7}\n\
pop {r0}\n\
bx r0\n\
.syntax divided");
}
#endif // NONMATCHING
#define ATK49_LAST_CASE 17
@@ -5271,10 +5015,9 @@ static void atk4E_switchinanim(void)
static void atk4F_jumpifcantswitch(void)
{
s32 val = 0;
s32 compareVar = 0;
struct Pokemon *party = NULL;
s32 r7 = 0;
s32 i;
s32 lastMonId;
struct Pokemon *party;
gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1] & ~(ATK4F_DONT_CHECK_STATUSES));
@@ -5294,20 +5037,20 @@ static void atk4F_jumpifcantswitch(void)
else
party = gPlayerParty;
val = 0;
if (2 & gActiveBattler)
val = 3;
i = 0;
if (gActiveBattler & 2)
i = 3;
for (compareVar = val + 3; val < compareVar; val++)
for (lastMonId = i + 3; i < lastMonId; i++)
{
if (GetMonData(&party[val], MON_DATA_SPECIES) != SPECIES_NONE
&& !GetMonData(&party[val], MON_DATA_IS_EGG)
&& GetMonData(&party[val], MON_DATA_HP) != 0
&& gBattlerPartyIndexes[gActiveBattler] != val)
if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE
&& !GetMonData(&party[i], MON_DATA_IS_EGG)
&& GetMonData(&party[i], MON_DATA_HP) != 0
&& gBattlerPartyIndexes[gActiveBattler] != i)
break;
}
if (val == compareVar)
if (i == lastMonId)
gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2);
else
gBattlescriptCurrInstr += 6;
@@ -5320,18 +5063,18 @@ static void atk4F_jumpifcantswitch(void)
{
party = gPlayerParty;
val = 0;
i = 0;
if (sub_806D82C(GetBattlerMultiplayerId(gActiveBattler)) == TRUE)
val = 3;
i = 3;
}
else
{
party = gEnemyParty;
if (gActiveBattler == 1)
val = 0;
i = 0;
else
val = 3;
i = 3;
}
}
else
@@ -5341,22 +5084,21 @@ static void atk4F_jumpifcantswitch(void)
else
party = gPlayerParty;
val = 0;
i = 0;
if (sub_806D82C(GetBattlerMultiplayerId(gActiveBattler)) == TRUE)
val = 3;
i = 3;
}
for (compareVar = val + 3; val < compareVar; val++)
for (lastMonId = i + 3; i < lastMonId; i++)
{
if (GetMonData(&party[val], MON_DATA_SPECIES) != SPECIES_NONE
&& !GetMonData(&party[val], MON_DATA_IS_EGG)
&& GetMonData(&party[val], MON_DATA_HP) != 0
&& gBattlerPartyIndexes[gActiveBattler] != val)
if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE
&& !GetMonData(&party[i], MON_DATA_IS_EGG)
&& GetMonData(&party[i], MON_DATA_HP) != 0
&& gBattlerPartyIndexes[gActiveBattler] != i)
break;
}
if (val == compareVar)
if (i == lastMonId)
gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2);
else
gBattlescriptCurrInstr += 6;
@@ -5365,58 +5107,61 @@ static void atk4F_jumpifcantswitch(void)
{
party = gEnemyParty;
val = 0;
if (gActiveBattler == 3)
val = 3;
i = 0;
if (gActiveBattler == B_POSITION_OPPONENT_RIGHT)
i = 3;
for (compareVar = val + 3; val < compareVar; val++)
for (lastMonId = i + 3; i < lastMonId; i++)
{
if (GetMonData(&party[val], MON_DATA_SPECIES) != SPECIES_NONE
&& !GetMonData(&party[val], MON_DATA_IS_EGG)
&& GetMonData(&party[val], MON_DATA_HP) != 0
&& gBattlerPartyIndexes[gActiveBattler] != val)
if (GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE
&& !GetMonData(&party[i], MON_DATA_IS_EGG)
&& GetMonData(&party[i], MON_DATA_HP) != 0
&& gBattlerPartyIndexes[gActiveBattler] != i)
break;
}
if (val == compareVar)
if (i == lastMonId)
gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2);
else
gBattlescriptCurrInstr += 6;
}
else
{
u8 battlerIn1, battlerIn2;
if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT)
{
r7 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
battlerIn1 = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
compareVar = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
battlerIn2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
else
compareVar = r7;
battlerIn2 = battlerIn1;
party = gEnemyParty;
}
else
{
r7 = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
battlerIn1 = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT);
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
compareVar = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);
battlerIn2 = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT);
else
compareVar = r7;
battlerIn2 = battlerIn1;
party = gPlayerParty;
}
for (val = 0; val < 6; val++)
for (i = 0; i < PARTY_SIZE; i++)
{
if (GetMonData(&party[val], MON_DATA_HP) != 0
&& GetMonData(&party[val], MON_DATA_SPECIES) != SPECIES_NONE
&& !GetMonData(&party[val], MON_DATA_IS_EGG)
&& val != gBattlerPartyIndexes[r7] && val != gBattlerPartyIndexes[compareVar])
if (GetMonData(&party[i], MON_DATA_HP) != 0
&& GetMonData(&party[i], MON_DATA_SPECIES) != SPECIES_NONE
&& !GetMonData(&party[i], MON_DATA_IS_EGG)
&& i != gBattlerPartyIndexes[battlerIn1] && i != gBattlerPartyIndexes[battlerIn2])
break;
}
if (val == 6)
if (i == 6)
gBattlescriptCurrInstr = BSScriptReadPtr(gBattlescriptCurrInstr + 2);
else
gBattlescriptCurrInstr += 6;

View File

@@ -31,6 +31,7 @@
#include "string_util.h"
#include "overworld.h"
#include "field_weather.h"
#include "gym_leader_rematch.h"
enum
{
@@ -66,7 +67,6 @@ 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 Overworld_GetFlashLevel(void);
extern u16 sub_81A9AA8(u8 localId);
extern u16 sub_81D6180(u8 localId);
@@ -252,84 +252,84 @@ static const struct TrainerBattleParameter sTrainerBContinueScriptBattleParams[]
const struct RematchTrainer gRematchTable[REMATCH_TABLE_ENTRIES] =
{
{{0x0025, 0x0028, 0x0029, 0x002a, 0x002b}, 0x0000, 0x0021},
{{0x02e1, 0x032c, 0x032d, 0x032e, 0x032f}, 0x0000, 0x0014},
{{0x002c, 0x002f, 0x0030, 0x0031, 0x0032}, 0x0000, 0x001a},
{{0x0039, 0x003c, 0x003d, 0x003e, 0x003f}, 0x0000, 0x0018},
{{0x0040, 0x0043, 0x0044, 0x0045, 0x0046}, 0x0000, 0x0018},
{{0x02af, 0x02b0, 0x02b1, 0x02b2, 0x02b3}, 0x0000, 0x0027},
{{0x02ff, 0x033c, 0x033d, 0x033e, 0x033f}, 0x0000, 0x0024},
{{0x005e, 0x0065, 0x0066, 0x0067, 0x0068}, 0x0000, 0x001a},
{{0x004e, 0x0054, 0x0055, 0x0056, 0x0057}, 0x0000, 0x001a},
{{0x006c, 0x006e, 0x006f, 0x0070, 0x0071}, 0x0018, 0x0014},
{{0x0072, 0x0078, 0x0079, 0x007a, 0x007b}, 0x0000, 0x0013},
{{0x0090, 0x034c, 0x034d, 0x034e, 0x034f}, 0x0018, 0x0038},
{{0x007f, 0x0084, 0x0085, 0x0086, 0x0087}, 0x0000, 0x0024},
{{0x0088, 0x008b, 0x008c, 0x008d, 0x008e}, 0x0000, 0x0013},
{{0x008f, 0x0093, 0x0094, 0x0095, 0x0096}, 0x0000, 0x001d},
{{0x009b, 0x00af, 0x00b0, 0x00b1, 0x00b2}, 0x0000, 0x0016},
{{0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb}, 0x0000, 0x001e},
{{0x02a0, 0x0338, 0x0339, 0x033a, 0x033b}, 0x0000, 0x002a},
{{0x00c3, 0x0340, 0x0341, 0x0342, 0x0343}, 0x0000, 0x0026},
{{0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8}, 0x0000, 0x0021},
{{0x00ce, 0x00cf, 0x00d0, 0x00d1, 0x00d2}, 0x0000, 0x001d},
{{0x00d8, 0x00db, 0x00dc, 0x00dd, 0x00de}, 0x0018, 0x000d},
{{0x02a9, 0x02aa, 0x02ab, 0x02ac, 0x02ad}, 0x0018, 0x0001},
{{0x00e2, 0x00e4, 0x00e5, 0x00e6, 0x00e7}, 0x0000, 0x0023},
{{0x00ee, 0x00ef, 0x00f0, 0x00f1, 0x00f2}, 0x0000, 0x0026},
{{0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd}, 0x0000, 0x0026},
{{0x00fe, 0x0101, 0x0102, 0x0103, 0x0104}, 0x0000, 0x0024},
{{0x0118, 0x011a, 0x011b, 0x011c, 0x011d}, 0x0000, 0x001f},
{{0x0111, 0x0114, 0x0115, 0x0116, 0x0117}, 0x0000, 0x001f},
{{0x011f, 0x0120, 0x0121, 0x0122, 0x0123}, 0x0000, 0x0020},
{{0x012e, 0x012f, 0x0130, 0x0131, 0x0132}, 0x0000, 0x0019},
{{0x0125, 0x0127, 0x0128, 0x0129, 0x012a}, 0x0000, 0x0012},
{{0x0133, 0x0134, 0x0135, 0x0136, 0x0137}, 0x0000, 0x001e},
{{0x0139, 0x013a, 0x013b, 0x013c, 0x013d}, 0x0018, 0x000c},
{{0x013e, 0x0148, 0x0149, 0x014a, 0x014b}, 0x0000, 0x0011},
{{0x0153, 0x015a, 0x015b, 0x015c, 0x015d}, 0x0000, 0x0015},
{{0x0178, 0x017b, 0x017c, 0x017d, 0x017e}, 0x0000, 0x002b},
{{0x0171, 0x0172, 0x0173, 0x0174, 0x0175}, 0x0000, 0x0020},
{{0x0166, 0x0168, 0x0169, 0x016a, 0x016b}, 0x0000, 0x0019},
{{0x016c, 0x016d, 0x016e, 0x016f, 0x0170}, 0x0000, 0x0020},
{{0x0182, 0x0184, 0x0185, 0x0186, 0x0187}, 0x0000, 0x002b},
{{0x0161, 0x0162, 0x0163, 0x0164, 0x0165}, 0x0000, 0x0019},
{{0x0179, 0x0334, 0x0335, 0x0336, 0x0337}, 0x0000, 0x0029},
{{0x0188, 0x0189, 0x018a, 0x018b, 0x018c}, 0x0018, 0x0001},
{{0x0196, 0x0199, 0x019a, 0x019b, 0x019c}, 0x0000, 0x0023},
{{0x01a3, 0x01a5, 0x01a6, 0x01a7, 0x01a8}, 0x0000, 0x001c},
{{0x01ab, 0x01ae, 0x01af, 0x01b0, 0x01b1}, 0x0000, 0x001e},
{{0x01b2, 0x01b5, 0x01b6, 0x01b7, 0x01b8}, 0x0000, 0x001c},
{{0x01c1, 0x01d1, 0x01d2, 0x01d3, 0x01d4}, 0x0000, 0x0027},
{{0x01da, 0x01dd, 0x01de, 0x01df, 0x01e0}, 0x0018, 0x000d},
{{0x01e1, 0x01e2, 0x01e7, 0x01e8, 0x01e9}, 0x0000, 0x0012},
{{0x01ec, 0x01f1, 0x01f2, 0x01f3, 0x01f4}, 0x0000, 0x0028},
{{0x02e4, 0x0330, 0x0331, 0x0332, 0x0333}, 0x0000, 0x0017},
{{0x0200, 0x0203, 0x0204, 0x0205, 0x0206}, 0x0000, 0x0019},
{{0x0221, 0x0224, 0x0225, 0x0226, 0x0227}, 0x0000, 0x0020},
{{0x021a, 0x021d, 0x021e, 0x021f, 0x0220}, 0x0000, 0x0020},
{{0x0009, 0x0348, 0x0349, 0x034a, 0x034b}, 0x0018, 0x0011},
{{0x022f, 0x0232, 0x0233, 0x0234, 0x0235}, 0x0000, 0x0022},
{{0x0228, 0x022b, 0x022c, 0x022d, 0x022e}, 0x0000, 0x0022},
{{0x025c, 0x025f, 0x0260, 0x0261, 0x0262}, 0x0000, 0x0013},
{{0x026d, 0x026e, 0x026f, 0x0270, 0x0271}, 0x0018, 0x000b},
{{0x0273, 0x027c, 0x027d, 0x027e, 0x027f}, 0x0000, 0x001b},
{{0x0001, 0x0344, 0x0345, 0x0346, 0x0347}, 0x0018, 0x000c},
{{0x0282, 0x0283, 0x0284, 0x0285, 0x0286}, 0x0018, 0x003e},
{{0x0291, 0x0292, 0x0293, 0x0294, 0x0294}, 0x0018, 0x002b},
{{0x0109, 0x0302, 0x0303, 0x0304, 0x0305}, 0x0000, 0x0003},
{{0x010a, 0x0306, 0x0307, 0x0308, 0x0309}, 0x0000, 0x000b},
{{0x010b, 0x030a, 0x030b, 0x030c, 0x030d}, 0x0000, 0x0002},
{{0x010c, 0x030e, 0x030f, 0x0310, 0x0311}, 0x0000, 0x000c},
{{0x010d, 0x0312, 0x0313, 0x0314, 0x0315}, 0x0000, 0x0000},
{{0x010e, 0x0316, 0x0317, 0x0318, 0x0319}, 0x0000, 0x0004},
{{0x010f, 0x031a, 0x031b, 0x031c, 0x031d}, 0x0000, 0x0006},
{{0x0110, 0x031e, 0x031f, 0x0320, 0x0321}, 0x0000, 0x0007},
{{0x0105, 0x0105, 0x0105, 0x0105, 0x0105}, 0x0000, 0x0008},
{{0x0106, 0x0106, 0x0106, 0x0106, 0x0106}, 0x0000, 0x0008},
{{0x0107, 0x0107, 0x0107, 0x0107, 0x0107}, 0x0000, 0x0008},
{{0x0108, 0x0108, 0x0108, 0x0108, 0x0108}, 0x0000, 0x0008},
{{0x014f, 0x014f, 0x014f, 0x014f, 0x014f}, 0x0000, 0x0008},
{{TRAINER_ROSE_1, TRAINER_ROSE_2, TRAINER_ROSE_3, TRAINER_ROSE_4, TRAINER_ROSE_5}, 0x0, 0x21},
{{TRAINER_ANDRES_1, TRAINER_ANDRES_2, TRAINER_ANDRES_3, TRAINER_ANDRES_4, TRAINER_ANDRES_5}, 0x0, 0x14},
{{TRAINER_DUSTY_1, TRAINER_DUSTY_2, TRAINER_DUSTY_3, TRAINER_DUSTY_4, TRAINER_DUSTY_5}, 0x0, 0x1a},
{{TRAINER_LOLA_1, TRAINER_LOLA_2, TRAINER_LOLA_3, TRAINER_LOLA_4, TRAINER_LOLA_5}, 0x0, 0x18},
{{TRAINER_RICKY_1, TRAINER_RICKY_2, TRAINER_RICKY_3, TRAINER_RICKY_4, TRAINER_RICKY_5}, 0x0, 0x18},
{{TRAINER_LILA_AND_ROY_1, TRAINER_LILA_AND_ROY_2, TRAINER_LILA_AND_ROY_3, TRAINER_LILA_AND_ROY_4, TRAINER_LILA_AND_ROY_5}, 0x0, 0x27},
{{TRAINER_CRISTIN_1, TRAINER_CRISTIN_2, TRAINER_CRISTIN_3, TRAINER_CRISTIN_4, TRAINER_CRISTIN_5}, 0x0, 0x24},
{{TRAINER_BROOKE_1, TRAINER_BROOKE_2, TRAINER_BROOKE_3, TRAINER_BROOKE_4, TRAINER_BROOKE_5}, 0x0, 0x1a},
{{TRAINER_WILTON_1, TRAINER_WILTON_2, TRAINER_WILTON_3, TRAINER_WILTON_4, TRAINER_WILTON_5}, 0x0, 0x1a},
{{TRAINER_VALERIE_1, TRAINER_VALERIE_2, TRAINER_VALERIE_3, TRAINER_VALERIE_4, TRAINER_VALERIE_5}, 0x18, 0x14},
{{TRAINER_CINDY_1, TRAINER_CINDY_3, TRAINER_CINDY_4, TRAINER_CINDY_5, TRAINER_CINDY_6}, 0x0, 0x13},
{{TRAINER_THALIA_1, TRAINER_THALIA_2, TRAINER_THALIA_3, TRAINER_THALIA_4, TRAINER_THALIA_5}, 0x18, 0x38},
{{TRAINER_JESSICA_1, TRAINER_JESSICA_2, TRAINER_JESSICA_3, TRAINER_JESSICA_4, TRAINER_JESSICA_5}, 0x0, 0x24},
{{TRAINER_WINSTON_1, TRAINER_WINSTON_2, TRAINER_WINSTON_3, TRAINER_WINSTON_4, TRAINER_WINSTON_5}, 0x0, 0x13},
{{TRAINER_STEVE_1, TRAINER_STEVE_2, TRAINER_STEVE_3, TRAINER_STEVE_4, TRAINER_STEVE_5}, 0x0, 0x1d},
{{TRAINER_TONY_1, TRAINER_TONY_2, TRAINER_TONY_3, TRAINER_TONY_4, TRAINER_TONY_5}, 0x0, 0x16},
{{TRAINER_NOB_1, TRAINER_NOB_2, TRAINER_NOB_3, TRAINER_NOB_4, TRAINER_NOB_5}, 0x0, 0x1e},
{{TRAINER_KOJI_1, TRAINER_KOJI_2, TRAINER_KOJI_3, TRAINER_KOJI_4, TRAINER_KOJI_5}, 0x0, 0x2a},
{{TRAINER_FERNANDO_1, TRAINER_FERNANDO_2, TRAINER_FERNANDO_3, TRAINER_FERNANDO_4, TRAINER_FERNANDO_5}, 0x0, 0x26},
{{TRAINER_DALTON_1, TRAINER_DALTON_2, TRAINER_DALTON_3, TRAINER_DALTON_4, TRAINER_DALTON_5}, 0x0, 0x21},
{{TRAINER_BERNIE_1, TRAINER_BERNIE_2, TRAINER_BERNIE_3, TRAINER_BERNIE_4, TRAINER_BERNIE_5}, 0x0, 0x1d},
{{TRAINER_ETHAN_1, TRAINER_ETHAN_2, TRAINER_ETHAN_3, TRAINER_ETHAN_4, TRAINER_ETHAN_5}, 0x18, 0xd},
{{TRAINER_JOHN_AND_JAY_1, TRAINER_JOHN_AND_JAY_2, TRAINER_JOHN_AND_JAY_3, TRAINER_JOHN_AND_JAY_4, TRAINER_JOHN_AND_JAY_5}, 0x18, 0x1},
{{TRAINER_JEFFREY_1, TRAINER_JEFFREY_2, TRAINER_JEFFREY_3, TRAINER_JEFFREY_4, TRAINER_JEFFREY_5}, 0x0, 0x23},
{{TRAINER_CAMERON_1, TRAINER_CAMERON_2, TRAINER_CAMERON_3, TRAINER_CAMERON_4, TRAINER_CAMERON_5}, 0x0, 0x26},
{{TRAINER_JACKI_1, TRAINER_JACKI_2, TRAINER_JACKI_3, TRAINER_JACKI_4, TRAINER_JACKI_5}, 0x0, 0x26},
{{TRAINER_WALTER_1, TRAINER_WALTER_2, TRAINER_WALTER_3, TRAINER_WALTER_4, TRAINER_WALTER_5}, 0x0, 0x24},
{{TRAINER_KAREN_1, TRAINER_KAREN_2, TRAINER_KAREN_3, TRAINER_KAREN_4, TRAINER_KAREN_5}, 0x0, 0x1f},
{{TRAINER_JERRY_1, TRAINER_JERRY_2, TRAINER_JERRY_3, TRAINER_JERRY_4, TRAINER_JERRY_5}, 0x0, 0x1f},
{{TRAINER_ANNA_AND_MEG_1, TRAINER_ANNA_AND_MEG_2, TRAINER_ANNA_AND_MEG_3, TRAINER_ANNA_AND_MEG_4, TRAINER_ANNA_AND_MEG_5}, 0x0, 0x20},
{{TRAINER_ISABEL_1, TRAINER_ISABEL_2, TRAINER_ISABEL_3, TRAINER_ISABEL_4, TRAINER_ISABEL_5}, 0x0, 0x19},
{{TRAINER_MIGUEL_1, TRAINER_MIGUEL_2, TRAINER_MIGUEL_3, TRAINER_MIGUEL_4, TRAINER_MIGUEL_5}, 0x0, 0x12},
{{TRAINER_TIMOTHY_1, TRAINER_TIMOTHY_2, TRAINER_TIMOTHY_3, TRAINER_TIMOTHY_4, TRAINER_TIMOTHY_5}, 0x0, 0x1e},
{{TRAINER_SHELBY_1, TRAINER_SHELBY_2, TRAINER_SHELBY_3, TRAINER_SHELBY_4, TRAINER_SHELBY_5}, 0x18, 0xc},
{{TRAINER_CALVIN_1, TRAINER_CALVIN_2, TRAINER_CALVIN_3, TRAINER_CALVIN_4, TRAINER_CALVIN_5}, 0x0, 0x11},
{{TRAINER_ELLIOT_1, TRAINER_ELLIOT_2, TRAINER_ELLIOT_3, TRAINER_ELLIOT_4, TRAINER_ELLIOT_5}, 0x0, 0x15},
{{TRAINER_ISAIAH_1, TRAINER_ISAIAH_2, TRAINER_ISAIAH_3, TRAINER_ISAIAH_4, TRAINER_ISAIAH_5}, 0x0, 0x2b},
{{TRAINER_MARIA_1, TRAINER_MARIA_2, TRAINER_MARIA_3, TRAINER_MARIA_4, TRAINER_MARIA_5}, 0x0, 0x20},
{{TRAINER_ABIGAIL_1, TRAINER_ABIGAIL_2, TRAINER_ABIGAIL_3, TRAINER_ABIGAIL_4, TRAINER_ABIGAIL_5}, 0x0, 0x19},
{{TRAINER_DYLAN_1, TRAINER_DYLAN_2, TRAINER_DYLAN_3, TRAINER_DYLAN_4, TRAINER_DYLAN_5}, 0x0, 0x20},
{{TRAINER_KATELYN_1, TRAINER_KATELYN_2, TRAINER_KATELYN_3, TRAINER_KATELYN_4, TRAINER_KATELYN_5}, 0x0, 0x2b},
{{TRAINER_BENJAMIN_1, TRAINER_BENJAMIN_2, TRAINER_BENJAMIN_3, TRAINER_BENJAMIN_4, TRAINER_BENJAMIN_5}, 0x0, 0x19},
{{TRAINER_PABLO_1, TRAINER_PABLO_2, TRAINER_PABLO_3, TRAINER_PABLO_4, TRAINER_PABLO_5}, 0x0, 0x29},
{{TRAINER_NICOLAS_1, TRAINER_NICOLAS_2, TRAINER_NICOLAS_3, TRAINER_NICOLAS_4, TRAINER_NICOLAS_5}, 0x18, 0x1},
{{TRAINER_ROBERT_1, TRAINER_ROBERT_2, TRAINER_ROBERT_3, TRAINER_ROBERT_4, TRAINER_ROBERT_5}, 0x0, 0x23},
{{TRAINER_LAO_1, TRAINER_LAO_2, TRAINER_LAO_3, TRAINER_LAO_4, TRAINER_LAO_5}, 0x0, 0x1c},
{{TRAINER_CYNDY_1, TRAINER_CYNDY_2, TRAINER_CYNDY_3, TRAINER_CYNDY_4, TRAINER_CYNDY_5}, 0x0, 0x1e},
{{TRAINER_MADELINE_1, TRAINER_MADELINE_2, TRAINER_MADELINE_3, TRAINER_MADELINE_4, TRAINER_MADELINE_5}, 0x0, 0x1c},
{{TRAINER_JENNY_1, TRAINER_JENNY_2, TRAINER_JENNY_3, TRAINER_JENNY_4, TRAINER_JENNY_5}, 0x0, 0x27},
{{TRAINER_DIANA_1, TRAINER_DIANA_2, TRAINER_DIANA_3, TRAINER_DIANA_4, TRAINER_DIANA_5}, 0x18, 0xd},
{{TRAINER_AMY_AND_LIV_1, TRAINER_AMY_AND_LIV_2, TRAINER_AMY_AND_LIV_4, TRAINER_AMY_AND_LIV_5, TRAINER_AMY_AND_LIV_6}, 0x0, 0x12},
{{TRAINER_ERNEST_1, TRAINER_ERNEST_2, TRAINER_ERNEST_3, TRAINER_ERNEST_4, TRAINER_ERNEST_5}, 0x0, 0x28},
{{TRAINER_CORY_1, TRAINER_CORY_2, TRAINER_CORY_3, TRAINER_CORY_4, TRAINER_CORY_5}, 0x0, 0x17},
{{TRAINER_EDWIN_1, TRAINER_EDWIN_2, TRAINER_EDWIN_3, TRAINER_EDWIN_4, TRAINER_EDWIN_5}, 0x0, 0x19},
{{TRAINER_LYDIA_1, TRAINER_LYDIA_2, TRAINER_LYDIA_3, TRAINER_LYDIA_4, TRAINER_LYDIA_5}, 0x0, 0x20},
{{TRAINER_ISAAC_1, TRAINER_ISAAC_2, TRAINER_ISAAC_3, TRAINER_ISAAC_4, TRAINER_ISAAC_5}, 0x0, 0x20},
{{TRAINER_GABRIELLE_1, TRAINER_GABRIELLE_2, TRAINER_GABRIELLE_3, TRAINER_GABRIELLE_4, TRAINER_GABRIELLE_5}, 0x18, 0x11},
{{TRAINER_CATHERINE_1, TRAINER_CATHERINE_2, TRAINER_CATHERINE_3, TRAINER_CATHERINE_4, TRAINER_CATHERINE_5}, 0x0, 0x22},
{{TRAINER_JACKSON_1, TRAINER_JACKSON_2, TRAINER_JACKSON_3, TRAINER_JACKSON_4, TRAINER_JACKSON_5}, 0x0, 0x22},
{{TRAINER_HALEY_1, TRAINER_HALEY_2, TRAINER_HALEY_3, TRAINER_HALEY_4, TRAINER_HALEY_5}, 0x0, 0x13},
{{TRAINER_JAMES_1, TRAINER_JAMES_2, TRAINER_JAMES_3, TRAINER_JAMES_4, TRAINER_JAMES_5}, 0x18, 0xb},
{{TRAINER_TRENT_1, TRAINER_TRENT_2, TRAINER_TRENT_3, TRAINER_TRENT_4, TRAINER_TRENT_5}, 0x0, 0x1b},
{{TRAINER_SAWYER_1, TRAINER_SAWYER_2, TRAINER_SAWYER_3, TRAINER_SAWYER_4, TRAINER_SAWYER_5}, 0x18, 0xc},
{{TRAINER_KIRA_AND_DAN_1, TRAINER_KIRA_AND_DAN_2, TRAINER_KIRA_AND_DAN_3, TRAINER_KIRA_AND_DAN_4, TRAINER_KIRA_AND_DAN_5}, 0x18, 0x3e},
{{TRAINER_WALLY_3, 0x292, 0x293, 0x294, 0x294}, 0x18, 0x2b},
{{TRAINER_ROXANNE_1, TRAINER_ROXANNE_2, TRAINER_ROXANNE_3, TRAINER_ROXANNE_4, TRAINER_ROXANNE_5}, 0x0, 0x3},
{{TRAINER_BRAWLY_1, TRAINER_BRAWLY_2, TRAINER_BRAWLY_3, TRAINER_BRAWLY_4, TRAINER_BRAWLY_5}, 0x0, 0xb},
{{TRAINER_WATTSON_1, TRAINER_WATTSON_2, TRAINER_WATTSON_3, TRAINER_WATTSON_4, TRAINER_WATTSON_5}, 0x0, 0x2},
{{TRAINER_FLANNERY_1, TRAINER_FLANNERY_2, TRAINER_FLANNERY_3, TRAINER_FLANNERY_4, TRAINER_FLANNERY_5}, 0x0, 0xc},
{{TRAINER_NORMAN_1, TRAINER_NORMAN_2, TRAINER_NORMAN_3, TRAINER_NORMAN_4, TRAINER_NORMAN_5}, 0x0, 0x0},
{{TRAINER_WINONA_1, TRAINER_WINONA_2, TRAINER_WINONA_3, TRAINER_WINONA_4, TRAINER_WINONA_5}, 0x0, 0x4},
{{TRAINER_TATE_AND_LIZA_1, TRAINER_TATE_AND_LIZA_2, TRAINER_TATE_AND_LIZA_3, TRAINER_TATE_AND_LIZA_4, TRAINER_TATE_AND_LIZA_5}, 0x0, 0x6},
{{TRAINER_JUAN_1, TRAINER_JUAN_2, TRAINER_JUAN_3, TRAINER_JUAN_4, TRAINER_JUAN_5}, 0x0, 0x7},
{{TRAINER_SIDNEY, TRAINER_SIDNEY, TRAINER_SIDNEY, TRAINER_SIDNEY, TRAINER_SIDNEY}, 0x0, 0x8},
{{TRAINER_PHOEBE, TRAINER_PHOEBE, TRAINER_PHOEBE, TRAINER_PHOEBE, TRAINER_PHOEBE}, 0x0, 0x8},
{{TRAINER_GLACIA, TRAINER_GLACIA, TRAINER_GLACIA, TRAINER_GLACIA, TRAINER_GLACIA}, 0x0, 0x8},
{{TRAINER_DRAKE, TRAINER_DRAKE, TRAINER_DRAKE, TRAINER_DRAKE, TRAINER_DRAKE}, 0x0, 0x8},
{{TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE}, 0x0, 0x8},
};
static const u16 sBadgeFlags[8] =
@@ -945,13 +945,13 @@ static void CB2_EndFirstBattle(void)
static void sub_80B1218(void)
{
if (GetGameStat(GAME_STAT_WILD_BATTLES) % 60 == 0)
sub_81DA57C();
UpdateGymLeaderRematch();
}
static void sub_80B1234(void)
{
if (GetGameStat(GAME_STAT_TRAINER_BATTLES) % 20 == 0)
sub_81DA57C();
UpdateGymLeaderRematch();
}
// why not just use the macros? maybe its because they didnt want to uncast const every time?

1576
src/battle_tv.c Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -23,7 +23,6 @@
#include "link.h"
#include "berry.h"
extern const struct BattleMove gBattleMoves[];
extern u8 weather_get_current(void);
@@ -3255,8 +3254,8 @@ u8 GetMoveTarget(u16 move, u8 useMoveTarget)
else
targetBank = GetBattlerAtPosition((GetBattlerPosition(gBattlerAttacker) & BIT_SIDE) ^ BIT_SIDE);
break;
case MOVE_TARGET_USER_OR_SELECTED:
case MOVE_TARGET_USER:
case MOVE_TARGET_x10:
targetBank = gBattlerAttacker;
break;
}

209
src/blit.c Normal file
View File

@@ -0,0 +1,209 @@
#include "global.h"
#include "blit.h"
void BlitBitmapRect4BitWithoutColorKey(struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height)
{
BlitBitmapRect4Bit(src, dst, srcX, srcY, dstX, dstY, width, height, 0xFF);
}
void BlitBitmapRect4Bit(struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height, u8 colorKey)
{
s32 xEnd;
s32 yEnd;
s32 multiplierSrcY;
s32 multiplierDstY;
s32 loopSrcY, loopDstY;
s32 loopSrcX, loopDstX;
u8 *pixelsSrc;
u8 *pixelsDst;
s32 toOrr;
s32 toAnd;
s32 toShift;
if (dst->width - dstX < width)
xEnd = (dst->width - dstX) + srcX;
else
xEnd = srcX + width;
if (dst->height - dstY < height)
yEnd = (dst->height - dstY) + srcY;
else
yEnd = height + srcY;
multiplierSrcY = (src->width + (src->width & 7)) >> 3;
multiplierDstY = (dst->width + (dst->width & 7)) >> 3;
if (colorKey == 0xFF)
{
for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++)
{
for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++)
{
pixelsSrc = src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1B);
pixelsDst = dst->pixels + ((loopDstX >> 1) & 3) + ((loopDstX >> 3) << 5) + (((loopDstY >> 3) * multiplierDstY) << 5) + ((u32)(loopDstY << 0x1d) >> 0x1B);
toOrr = ((*pixelsSrc >> ((loopSrcX & 1) << 2)) & 0xF);
toShift = ((loopDstX & 1) << 2);
toOrr <<= toShift;
toAnd = 0xF0 >> (toShift);
*pixelsDst = toOrr | (*pixelsDst & toAnd);
}
}
}
else
{
for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++)
{
for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++)
{
pixelsSrc = src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1B);
pixelsDst = dst->pixels + ((loopDstX >> 1) & 3) + ((loopDstX >> 3) << 5) + (((loopDstY >> 3) * multiplierDstY) << 5) + ((u32)(loopDstY << 0x1d) >> 0x1B);
toOrr = ((*pixelsSrc >> ((loopSrcX & 1) << 2)) & 0xF);
if (toOrr != colorKey)
{
toShift = ((loopDstX & 1) << 2);
toOrr <<= toShift;
toAnd = 0xF0 >> (toShift);
*pixelsDst = toOrr | (*pixelsDst & toAnd);
}
}
}
}
}
void FillBitmapRect4Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue)
{
s32 xEnd;
s32 yEnd;
s32 multiplierY;
s32 loopX, loopY;
s32 toOrr1, toOrr2;
xEnd = x + width;
if (xEnd > surface->width)
xEnd = surface->width;
yEnd = y + height;
if (yEnd > surface->height)
yEnd = surface->height;
multiplierY = (surface->width + (surface->width & 7)) >> 3;
toOrr1 = (u32)(fillValue << 0x1C) >> 0x18;
toOrr2 = (fillValue & 0xF);
for (loopY = y; loopY < yEnd; loopY++)
{
for (loopX = x; loopX < xEnd; loopX++)
{
u8 *pixels = surface->pixels + ((loopX >> 1) & 3) + ((loopX >> 3) << 5) + (((loopY >> 3) * multiplierY) << 5) + ((u32)(loopY << 0x1d) >> 0x1B);
if ((loopX << 0x1F) != 0)
*pixels = toOrr1 | (*pixels & 0xF);
else
*pixels = toOrr2 | (*pixels & 0xF0);
}
}
}
void BlitBitmapRect4BitTo8Bit(struct Bitmap *src, struct Bitmap *dst, u16 srcX, u16 srcY, u16 dstX, u16 dstY, u16 width, u16 height, u8 colorKey, u8 paletteOffset)
{
s32 palOffsetBits;
s32 xEnd;
s32 yEnd;
s32 multiplierSrcY;
s32 multiplierDstY;
s32 loopSrcY, loopDstY;
s32 loopSrcX, loopDstX;
u8 *pixelsSrc;
u8 *pixelsDst;
s32 colorKeyBits;
palOffsetBits = (u32)(paletteOffset << 0x1C) >> 0x18;
colorKeyBits = (u32)(colorKey << 0x1C) >> 0x18;
if (dst->width - dstX < width)
xEnd = (dst->width - dstX) + srcX;
else
xEnd = width + srcX;
if (dst->height - dstY < height)
yEnd = (srcY + dst->height) - dstY;
else
yEnd = srcY + height;
multiplierSrcY = (src->width + (src->width & 7)) >> 3;
multiplierDstY = (dst->width + (dst->width & 7)) >> 3;
if (colorKey == 0xFF)
{
for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++)
{
pixelsSrc = src->pixels + ((srcX >> 1) & 3) + ((srcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1b);
for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++)
{
pixelsDst = dst->pixels + (loopDstX & 7) + ((loopDstX >> 3) << 6) + (((loopDstY >> 3) * multiplierDstY) << 6) + ((u32)(loopDstY << 0x1d) >> 0x1a);
if (loopSrcX & 1)
{
*pixelsDst = palOffsetBits + (*pixelsSrc >> 4);
}
else
{
pixelsSrc = src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1b);
*pixelsDst = palOffsetBits + (*pixelsSrc & 0xF);
}
}
}
}
else
{
for (loopSrcY = srcY, loopDstY = dstY; loopSrcY < yEnd; loopSrcY++, loopDstY++)
{
pixelsSrc = src->pixels + ((srcX >> 1) & 3) + ((srcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1b);
for (loopSrcX = srcX, loopDstX = dstX; loopSrcX < xEnd; loopSrcX++, loopDstX++)
{
if (loopSrcX & 1)
{
if ((*pixelsSrc & 0xF0) != colorKeyBits)
{
pixelsDst = dst->pixels + (loopDstX & 7) + ((loopDstX >> 3) << 6) + (((loopDstY >> 3) * multiplierDstY) << 6) + ((u32)(loopDstY << 0x1d) >> 0x1a);
*pixelsDst = palOffsetBits + (*pixelsSrc >> 4);
}
}
else
{
pixelsSrc = src->pixels + ((loopSrcX >> 1) & 3) + ((loopSrcX >> 3) << 5) + (((loopSrcY >> 3) * multiplierSrcY) << 5) + ((u32)(loopSrcY << 0x1d) >> 0x1b);
if ((*pixelsSrc & 0xF) != colorKey)
{
pixelsDst = dst->pixels + (loopDstX & 7) + ((loopDstX >> 3) << 6) + (((loopDstY >> 3) * multiplierDstY) << 6) + ((u32)(loopDstY << 0x1d) >> 0x1a);
*pixelsDst = palOffsetBits + (*pixelsSrc & 0xF);
}
}
}
}
}
}
void FillBitmapRect8Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue)
{
s32 xEnd;
s32 yEnd;
s32 multiplierY;
s32 loopX, loopY;
xEnd = x + width;
if (xEnd > surface->width)
xEnd = surface->width;
yEnd = y + height;
if (yEnd > surface->height)
yEnd = surface->height;
multiplierY = (surface->width + (surface->width & 7)) >> 3;
for (loopY = y; loopY < yEnd; loopY++)
{
for (loopX = x; loopX < xEnd; loopX++)
{
u8 *pixels = surface->pixels + (loopX & 7) + ((loopX >> 3) << 6) + (((loopY >> 3) * multiplierY) << 6) + ((u32)(loopY << 0x1d) >> 0x1a);
*pixels = fillValue;
}
}
}

367
src/fldeff_flash.c Normal file
View File

@@ -0,0 +1,367 @@
#include "global.h"
#include "constants/songs.h"
#include "braille_puzzles.h"
#include "event_data.h"
#include "event_scripts.h"
#include "field_effect.h"
#include "gpu_regs.h"
#include "gba/io_reg.h"
#include "main.h"
#include "palette.h"
#include "party_menu.h"
#include "overworld.h"
#include "rom6.h"
#include "script.h"
#include "sound.h"
#include "sprite.h"
#include "task.h"
// structures
struct FlashStruct
{
u8 unk0;
u8 unk1;
bool8 unk2;
bool8 unk3;
void (*func)(void);
};
// static functions
static void hm2_flash(void);
static void sub_81371B4(void);
static bool8 sub_8137304(void);
static void sub_81373F0(void);
static void sub_8137404(u8 taskId);
static void sub_8137420(u8 taskId);
static void sub_81374C4(u8 taskId);
static void sub_813750C(u8 taskId);
static void sub_8137574(u8 taskId);
static void sub_81375A8(void);
static void sub_81375BC(u8 taskId);
static void sub_81375D8(u8 taskId);
static void sub_8137678(u8 taskId);
static void sub_81376DC(u8 taskId);
// rodata
static const struct FlashStruct gUnknown_085B27C8[] =
{
{1, 4, 1, 0, sub_81375A8},
{2, 4, 1, 0, sub_81375A8},
{3, 4, 1, 0, sub_81375A8},
{5, 4, 1, 0, sub_81375A8},
{6, 4, 1, 0, sub_81375A8},
{7, 4, 1, 0, sub_81375A8},
{8, 4, 1, 0, sub_81375A8},
{9, 4, 1, 0, sub_81375A8},
{4, 1, 0, 1, sub_81373F0},
{4, 2, 0, 1, sub_81373F0},
{4, 3, 0, 1, sub_81373F0},
{4, 5, 0, 1, sub_81373F0},
{4, 6, 0, 1, sub_81373F0},
{4, 7, 0, 1, sub_81373F0},
{4, 8, 0, 1, sub_81373F0},
{4, 9, 0, 1, sub_81373F0},
{0, 0, 0, 0, NULL},
};
static const u16 gCaveTransitionPalette_White[] = INCBIN_U16("graphics/misc/cave_transition_white.gbapal");
static const u16 gCaveTransitionPalette_Black[] = INCBIN_U16("graphics/misc/cave_transition_black.gbapal");
static const u16 gUnknown_085B2890[] = INCBIN_U16("graphics/misc/85B2890.gbapal");
static const u16 gUnknown_085B28A0[] = INCBIN_U16("graphics/misc/85B28A0.gbapal");
static const u16 gCaveTransitionTilemap[] = INCBIN_U16("graphics/misc/cave_transition_map.bin.lz");
static const u8 gCaveTransitionTiles[] = INCBIN_U8("graphics/misc/cave_transition.4bpp.lz");
// text
bool8 SetUpFieldMove_Flash(void)
{
if (ShouldDoBrailleFlyEffect())
{
gSpecialVar_Result = GetCursorSelectionMonId();
gUnknown_03005DB0 = FieldCallback_Teleport;
gUnknown_0203CEEC = sub_8179918;
return TRUE;
}
else if (gMapHeader.cave == TRUE && !FlagGet(FLAG_SYS_USE_FLASH))
{
gUnknown_03005DB0 = FieldCallback_Teleport;
gUnknown_0203CEEC = hm2_flash;
return TRUE;
}
return FALSE;
}
static void hm2_flash(void)
{
u8 taskId = oei_task_add();
gFieldEffectArguments[0] = GetCursorSelectionMonId();
gTasks[taskId].data[8] = (uintptr_t)sub_81371B4 >> 16;
gTasks[taskId].data[9] = (uintptr_t)sub_81371B4;
}
static void sub_81371B4(void)
{
PlaySE(SE_W115);
FlagSet(FLAG_SYS_USE_FLASH);
ScriptContext1_SetupScript(EventScript_2926F8);
}
static void sub_81371D4(void)
{
RunTasks();
AnimateSprites();
BuildOamBuffer();
UpdatePaletteFade();
}
static void sub_81371EC(void)
{
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
}
void c2_change_map(void)
{
u16 ime;
SetVBlankCallback(NULL);
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();
ResetTasks();
ResetSpriteData();
ime = REG_IME;
REG_IME = 0;
REG_IE |= INTR_FLAG_VBLANK;
REG_IME = ime;
SetVBlankCallback(sub_81371EC);
SetMainCallback2(sub_81371D4);
if (!sub_8137304())
SetMainCallback2(gMain.savedCallback);
}
static bool8 sub_8137304(void)
{
u8 i;
u8 v0 = get_map_light_from_warp0();
u8 v1 = Overworld_GetMapTypeOfSaveblockLocation();
for (i = 0; gUnknown_085B27C8[i].unk0; i++)
{
if (gUnknown_085B27C8[i].unk0 == v0 && gUnknown_085B27C8[i].unk1 == v1)
{
gUnknown_085B27C8[i].func();
return TRUE;
}
}
return FALSE;
}
bool8 sub_8137360(u8 a1, u8 a2)
{
u8 i;
u8 v0 = a1;
u8 v1 = a2;
for (i = 0; gUnknown_085B27C8[i].unk0; i++)
{
if (gUnknown_085B27C8[i].unk0 == v0 && gUnknown_085B27C8[i].unk1 == v1)
{
return gUnknown_085B27C8[i].unk2;
}
}
return FALSE;
}
bool8 fade_type_for_given_maplight_pair(u8 a1, u8 a2)
{
u8 i;
u8 v0 = a1;
u8 v1 = a2;
for (i = 0; gUnknown_085B27C8[i].unk0; i++)
{
if (gUnknown_085B27C8[i].unk0 == v0 && gUnknown_085B27C8[i].unk1 == v1)
{
return gUnknown_085B27C8[i].unk3;
}
}
return FALSE;
}
static void sub_81373F0(void)
{
CreateTask(sub_8137404, 0);
}
static void sub_8137404(u8 taskId)
{
gTasks[taskId].func = sub_8137420;
}
static void sub_8137420(u8 taskId)
{
SetGpuReg(REG_OFFSET_DISPCNT, 0);
LZ77UnCompVram(gCaveTransitionTiles, (void *)0x600C000);
LZ77UnCompVram(gCaveTransitionTilemap, (void *)0x600F800);
LoadPalette(gCaveTransitionPalette_White, 0xE0, 0x20);
LoadPalette(gUnknown_085B28A0, 0xE0, 0x10);
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0
| BLDCNT_EFFECT_BLEND
| BLDCNT_TGT2_BG1
| BLDCNT_TGT2_BG2
| BLDCNT_TGT2_BG3
| BLDCNT_TGT2_OBJ
| BLDCNT_TGT2_BD);
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
SetGpuReg(REG_OFFSET_BLDY, 0);
SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0)
| BGCNT_CHARBASE(3)
| BGCNT_SCREENBASE(31)
| BGCNT_16COLOR
| BGCNT_TXT256x256);
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0
| DISPCNT_OBJ_1D_MAP
| DISPCNT_BG0_ON
| DISPCNT_OBJ_ON);
gTasks[taskId].func = sub_81374C4;
gTasks[taskId].data[0] = 16;
gTasks[taskId].data[1] = 0;
}
static void sub_81374C4(u8 taskId)
{
u16 count = gTasks[taskId].data[1];
u16 blend = count + 0x1000;
SetGpuReg(REG_OFFSET_BLDALPHA, blend);
if (count <= 0x10)
{
gTasks[taskId].data[1]++;
}
else
{
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = sub_813750C;
}
}
static void sub_813750C(u8 taskId)
{
u16 count;
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 16));
count = gTasks[taskId].data[2];
if (count < 8)
{
gTasks[taskId].data[2]++;
LoadPalette(&gUnknown_085B28A0[count], 0xE0, 16 - 2 * count);
}
else
{
LoadPalette(gCaveTransitionPalette_White, 0, 0x20);
gTasks[taskId].func = sub_8137574;
gTasks[taskId].data[2] = 8;
}
}
static void sub_8137574(u8 taskId)
{
if (gTasks[taskId].data[2])
gTasks[taskId].data[2]--;
else
SetMainCallback2(gMain.savedCallback);
}
static void sub_81375A8(void)
{
CreateTask(sub_81375BC, 0);
}
static void sub_81375BC(u8 taskId)
{
gTasks[taskId].func = sub_81375D8;
}
static void sub_81375D8(u8 taskId)
{
SetGpuReg(REG_OFFSET_DISPCNT, 0);
LZ77UnCompVram(gCaveTransitionTiles, (void *)0x600C000);
LZ77UnCompVram(gCaveTransitionTilemap, (void *)0x600F800);
SetGpuReg(REG_OFFSET_BLDCNT, 0);
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
SetGpuReg(REG_OFFSET_BLDY, 0);
SetGpuReg(REG_OFFSET_BG0CNT, BGCNT_PRIORITY(0)
| BGCNT_CHARBASE(3)
| BGCNT_SCREENBASE(31)
| BGCNT_16COLOR
| BGCNT_TXT256x256);
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0
| DISPCNT_OBJ_1D_MAP
| DISPCNT_BG0_ON
| DISPCNT_OBJ_ON);
LoadPalette(gCaveTransitionPalette_White, 0xE0, 0x20);
LoadPalette(gCaveTransitionPalette_Black, 0, 0x20);
gTasks[taskId].func = sub_8137678;
gTasks[taskId].data[0] = 16;
gTasks[taskId].data[1] = 0;
gTasks[taskId].data[2] = 0;
}
static void sub_8137678(u8 taskId)
{
u16 count = gTasks[taskId].data[2];
if (count < 16)
{
gTasks[taskId].data[2]++;
gTasks[taskId].data[2]++;
LoadPalette(&gUnknown_085B2890[15 - count], 0xE0, 2 * (count + 1));
}
else
{
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 16));
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0
| BLDCNT_EFFECT_BLEND
| BLDCNT_TGT2_BG1
| BLDCNT_TGT2_BG2
| BLDCNT_TGT2_BG3
| BLDCNT_TGT2_OBJ
| BLDCNT_TGT2_BD);
gTasks[taskId].func = sub_81376DC;
}
}
static void sub_81376DC(u8 taskId)
{
u16 count = 16 - gTasks[taskId].data[1];
u16 blend = count + 0x1000;
SetGpuReg(REG_OFFSET_BLDALPHA, blend);
if (count)
{
gTasks[taskId].data[1]++;
}
else
{
LoadPalette(gCaveTransitionPalette_Black, 0, 0x20);
SetMainCallback2(gMain.savedCallback);
}
}

299
src/fldeff_groundshake.c Normal file
View File

@@ -0,0 +1,299 @@
#include "global.h"
#include "global.fieldmap.h"
#include "constants/flags.h"
#include "constants/songs.h"
#include "event_data.h"
#include "field_camera.h"
#include "field_map_obj.h"
#include "malloc.h"
#include "random.h"
#include "roulette_util.h"
#include "script.h"
#include "sound.h"
#include "sprite.h"
#include "task.h"
// structures
struct Struct203CF18 {
u8 taskId;
struct InnerStruct203CF18 unk4;
}; //size = 0xC8
// extern data
extern const struct SpriteSheet gUnknown_08617D94[];
extern const s16 gUnknown_08617D64[][3];
// static functions
static void sub_81BE808(u8 taskId);
static void sub_81BE900(u8 taskId);
static void sub_81BE968(void);
static void sub_81BE9C0(u8 taskId);
static void sub_81BEA00(u8 taskId);
static void sub_81BEA20(void);
static void sub_81BEAD8(struct Sprite* sprite);
// rodata
static const u8 gUnknown_08617E18[] = {0x3b, 0x43, 0x61, 0x00, 0x0f, 0x05, 0xff, 0x9b};
static const union AnimCmd gSpriteAnim_8617E20[] =
{
ANIMCMD_FRAME(0, 12),
ANIMCMD_JUMP(0),
};
static const union AnimCmd *const gSpriteAnimTable_8617E28[] =
{
gSpriteAnim_8617E20,
};
static const struct OamData gUnknown_08617E2C =
{
.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 struct SpriteTemplate gUnknown_08617E34 = {
0x0FA0, 0xFFFF, &gUnknown_08617E2C, gSpriteAnimTable_8617E28, NULL, gDummySpriteAffineAnimTable, sub_81BEAD8
};
static const union AnimCmd gSpriteAnim_8617E4C[] =
{
ANIMCMD_FRAME(0, 12),
ANIMCMD_JUMP(0),
};
static const union AnimCmd *const gSpriteAnim_8617E54[] =
{
gSpriteAnim_8617E4C,
};
static const struct OamData gSpriteAnim_8617E58 =
{
.y = 0,
.affineMode = 0,
.objMode = 0,
.mosaic = 0,
.bpp = 0,
.shape = 0,
.x = 0,
.matrixNum = 0,
.size = 1,
.tileNum = 0,
.priority = 0,
.paletteNum = 0,
.affineParam = 0,
};
static const struct SpriteTemplate gUnknown_08617E60 = {
0x0FA0, 0xFFFF, &gSpriteAnim_8617E58, gSpriteAnim_8617E54, NULL, gDummySpriteAffineAnimTable, sub_81BEAD8
};
// ewram
EWRAM_DATA struct Struct203CF18 *gUnknown_0203CF18 = NULL;
// text
bool8 sub_81BE66C(void)
{
if (!(gSaveBlock1Ptr->location.mapGroup == 0x0 && gSaveBlock1Ptr->location.mapNum == 0x1A))
return 0;
return FlagGet(FLAG_0x14E);
}
void sub_81BE698(u8 taskId)
{
sub_8151E50(&(gUnknown_0203CF18->unk4));
}
void sub_81BE6AC(void)
{
gUnknown_0203CF18 = NULL;
}
void sub_81BE6B8(void)
{
if(gUnknown_0203CF18 != NULL)
{
gUnknown_0203CF18 = NULL;
return;
}
if(!(gSaveBlock1Ptr->location.mapGroup == 0x0 && gSaveBlock1Ptr->location.mapNum == 0x1A) || !FlagGet(FLAG_0x14E))
return;
gUnknown_0203CF18 = (struct Struct203CF18 *)AllocZeroed(sizeof(struct Struct203CF18));
sub_8151B3C(&(gUnknown_0203CF18->unk4));
sub_8151B68(&(gUnknown_0203CF18->unk4), gUnknown_08617E18);
sub_8151CA8(&(gUnknown_0203CF18->unk4), 1, 1);
gUnknown_0203CF18->taskId = CreateTask(sub_81BE698, 0xFF);
}
void sub_81BE72C(void)
{
if(!(gSaveBlock1Ptr->location.mapGroup == 0x0 && gSaveBlock1Ptr->location.mapNum == 0x1A) || !FlagGet(FLAG_0x14E) || gUnknown_0203CF18 == NULL)
return;
if(FuncIsActiveTask(sub_81BE698))
DestroyTask(gUnknown_0203CF18->taskId);
sub_8151D28(&(gUnknown_0203CF18->unk4), 1, 1);
sub_8151C50(&(gUnknown_0203CF18->unk4), 1, 1);
Free(gUnknown_0203CF18);
gUnknown_0203CF18 = NULL;
}
void sub_81BE79C(void)
{
u16 rand;
bool8 chance;
if(VarGet(VAR_0x40CB) != 0)
{
FlagClear(FLAG_0x14E);
return;
}
rand = Random();
chance = rand & 1;
if(FlagGet(FLAG_0x09D) == TRUE)
chance = TRUE;
if(chance)
{
FlagSet(FLAG_0x14E);
sub_81BE6B8();
return;
}
FlagClear(FLAG_0x14E);
}
void sub_81BE7F4(void)
{
CreateTask(sub_81BE808, 0x8);
}
static void sub_81BE808(u8 taskId)
{
u8 mapObjectIdBuffer;
struct MapObject *fieldMapObject;
struct MapObject *playerAvatarMapObject;
TryGetFieldObjectIdByLocalIdAndMap(0x2D, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &mapObjectIdBuffer);
fieldMapObject = &(gMapObjects[mapObjectIdBuffer]);
gSprites[fieldMapObject->spriteId].pos2.y += 4;
playerAvatarMapObject = &(gMapObjects[gPlayerAvatar.mapObjectId]);
if((gSprites[fieldMapObject->spriteId].pos1.y + gSprites[fieldMapObject->spriteId].pos2.y) >=
(gSprites[playerAvatarMapObject->spriteId].pos1.y + gSprites[playerAvatarMapObject->spriteId].pos2.y))
{
DestroyTask(taskId);
EnableBothScriptContexts();
}
}
static void sp136_strengh_sound(u8 a, u8 b, u8 c, u8 d)
{
u8 taskId;
taskId = CreateTask(sub_81BE900, 0x9);
gTasks[taskId].data[0] = b;
gTasks[taskId].data[1] = 0;
gTasks[taskId].data[2] = c;
gTasks[taskId].data[3] = d;
gTasks[taskId].data[4] = a;
SetCameraPanningCallback(NULL);
PlaySE(SE_W070);
}
static void sub_81BE900(u8 taskId)
{
s16 *data;
data = gTasks[taskId].data;
data[1]++;
if((data[1] % data[3]) == 0)
{
data[1] = 0;
data[2]--;
data[0] = -data[0];
data[4] = -data[4];
SetCameraPanning(data[0], data[4]);
if(!data[2])
{
sub_81BE968();
DestroyTask(taskId);
InstallCameraPanAheadCallback();
}
}
}
static void sub_81BE968(void)
{
u8 taskId;
taskId = FindTaskIdByFunc(sub_81BE9C0);
if(taskId != 0xFF)
gTasks[taskId].data[0]++;
}
void sub_81BE994(void)
{
LoadSpriteSheets(gUnknown_08617D94);
sub_81BEA20();
CreateTask(sub_81BE9C0, 0x8);
sp136_strengh_sound(2, 1, 16, 3);
}
static void sub_81BE9C0(u8 taskId)
{
u16 *data;
data = gTasks[taskId].data;
data[1]++;
if(data[1] == 1000 || data[0] == 17)
gTasks[taskId].func = sub_81BEA00;
}
static void sub_81BEA00(u8 taskId)
{
FreeSpriteTilesByTag(4000);
DestroyTask(taskId);
EnableBothScriptContexts();
}
static void sub_81BEA20(void)
{
u8 i;
u8 spriteId;
for(i = 0; i < 8; i++)
{
spriteId = CreateSprite(&gUnknown_08617E60, gUnknown_08617D64[i][0] + 120, gUnknown_08617D64[i][1], 8);
gSprites[spriteId].oam.priority = 0;
gSprites[spriteId].oam.paletteNum = 0;
gSprites[spriteId].data[0] = i;
}
for(i = 0; i < 8; i++)
{
spriteId = CreateSprite(&gUnknown_08617E34, gUnknown_08617D64[i][0] + 115, gUnknown_08617D64[i][1] - 3, 8);
gSprites[spriteId].oam.priority = 0;
gSprites[spriteId].oam.paletteNum = 0;
gSprites[spriteId].data[0] = i;
}
}
static void sub_81BEAD8(struct Sprite* sprite)
{
sprite->data[1] += 2;
sprite->pos2.y = (sprite->data[1] / 2);
if(((sprite->pos1.y) + (sprite->pos2.y)) > gUnknown_08617D64[sprite->data[0]][2])
{
DestroySprite(sprite);
sub_81BE968();
}
}

View File

@@ -9,10 +9,10 @@
#include "strings.h"
#include "task.h"
void sub_816166C(u8 taskId);
void sub_81617B8(u8 taskId);
void sub_81616C0(u8 taskId);
void sub_8161724(u8 taskId);
static void sub_816166C(u8 taskId);
static void sub_81616C0(u8 taskId);
static void sub_8161724(u8 taskId);
static void sub_81617B8(u8 taskId);
bool8 SetUpFieldMove_SoftBoiled(void)
{
@@ -63,13 +63,13 @@ void sub_81615A8(u8 taskId)
sub_81B1F18(taskId, unk9, -1, GetMonData(&gPlayerParty[unk9], MON_DATA_MAX_HP)/5, sub_816166C);
}
void sub_816166C(u8 taskId)
static void sub_816166C(u8 taskId)
{
PlaySE(SE_KAIFUKU);
sub_81B1F18(taskId, gUnknown_0203CEC8.unkA, 1, GetMonData(&gPlayerParty[gUnknown_0203CEC8.unk9], MON_DATA_MAX_HP)/5, sub_81616C0);
}
void sub_81616C0(u8 taskId)
static void sub_81616C0(u8 taskId)
{
GetMonNickname(&gPlayerParty[gUnknown_0203CEC8.unkA], gStringVar1);
StringExpandPlaceholders(gStringVar4, gText_PkmnHPRestoredByVar2);
@@ -78,7 +78,7 @@ void sub_81616C0(u8 taskId)
gTasks[taskId].func = sub_8161724;
}
void sub_8161724(u8 taskId)
static void sub_8161724(u8 taskId)
{
if(sub_81B1BD4() == 1)
return;
@@ -92,7 +92,7 @@ void sub_8161724(u8 taskId)
gTasks[taskId].func = sub_81B1370;
}
void sub_8161784(u8 taskId)
static void sub_8161784(u8 taskId)
{
if(sub_81B1BD4() == 1)
return;
@@ -100,7 +100,7 @@ void sub_8161784(u8 taskId)
gTasks[taskId].func = sub_81B1370;
}
void sub_81617B8(u8 taskId)
static void sub_81617B8(u8 taskId)
{
PlaySE(SE_SELECT);
sub_81B1B5C(&gText_CantBeUsedOnPkmn, 0);

View File

@@ -7,9 +7,11 @@
#include "script.h"
#include "task.h"
void FldEff_UseStrength(void);
void sub_8145E74(void);
// static functions
static void FldEff_UseStrength(void);
static void sub_8145E74(void);
// text
bool8 SetUpFieldMove_Strength(void)
{
if (npc_before_player_of_type(87) == TRUE)
@@ -22,7 +24,7 @@ bool8 SetUpFieldMove_Strength(void)
return FALSE;
}
void FldEff_UseStrength(void)
static void FldEff_UseStrength(void)
{
gFieldEffectArguments[0] = GetCursorSelectionMonId();
ScriptContext1_SetupScript(FieryPath_EventScript_2908FD);
@@ -37,7 +39,7 @@ bool8 sub_8145E2C(void)
return FALSE;
}
void sub_8145E74(void)
static void sub_8145E74(void)
{
FieldEffectActiveListRemove(FLDEFF_USE_STRENGTH);
EnableBothScriptContexts();

View File

@@ -6,7 +6,6 @@
#include "field_effect.h"
#include "field_player_avatar.h"
#include "field_screen.h"
#include "fldeff_groundshake.h"
#include "palette.h"
#include "party_menu.h"
#include "rom6.h"
@@ -20,6 +19,8 @@ void hm2_sweet_scent(void);
void sub_8159F5C(void);
void sub_8159FEC(u8 taskId);
void sub_815A090(u8 taskId);
void sub_81BE6B8(void);
void sub_81BE72C(void);
bool8 SetUpFieldMove_SweetScent(void)
{

770
src/fossil_specials.c Normal file
View File

@@ -0,0 +1,770 @@
#include "global.h"
#include "constants/flags.h"
#include "constants/songs.h"
#include "bg.h"
#include "event_data.h"
#include "field_camera.h"
#include "field_map_obj.h"
#include "fieldmap.h"
#include "global.fieldmap.h"
#include "gpu_regs.h"
#include "malloc.h"
#include "menu.h"
#include "random.h"
#include "script.h"
#include "sound.h"
#include "sprite.h"
#include "task.h"
#include "window.h"
#define MIRAGE_TOWER_GFX_LENGTH (sizeof(gUnknown_08617274) + sizeof(gMirageTower_Gfx))
#define MIRAGE_TOWER_PALETTE_LENGTH 0x800
#define ROOT_FOSSIL_GFX_LENGTH sizeof(gRootFossil_Gfx)
#define ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH 0x100
//struct
struct Struct8617DA4 {
u8 x;
u8 y;
u16 tileId;
};
struct Struct203CF10 {
u8 *buffer;
u8 curr_buffer_index;
};
struct DynamicSpriteFrameImage{
u8 *data;
u16 size;
};
struct Struct203CF0C {
u8 *frameImageTiles;
struct DynamicSpriteFrameImage *frameImage;
u8 spriteId;
u16 *unkC;
u16 unk10;
};
// static functions
static void sub_81BED50(u8 taskId);
static void sub_81BEBF4(u8 taskId);
static void sub_81BF028(u8 taskId);
static void sub_81BF248(struct Sprite *);
/*static*/ void sub_81BF2B8(u8* a, u16 b, u8 c, u8 d, u8 e);
// .rodata
static const u8 gUnknown_08617274[] = {00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00};
static const u8 gMirageTower_Gfx[] = INCBIN_U8("graphics/misc/mirage_tower.4bpp");
static const u16 gUnknown_08617B94[] = INCBIN_U16("graphics/misc/mirage_tower.bin");
static const u16 gRootFossil_Pal[] = INCBIN_U16("graphics/misc/fossil.gbapal");
static const u8 gRootFossil_Gfx[] = INCBIN_U8("graphics/misc/fossil.4bpp");
static const u8 gMirageTowerCrumbles_Gfx[] = INCBIN_U8("graphics/misc/mirage_tower_crumbles.4bpp");
static const u16 gMirageTowerCrumbles_Palette[] = INCBIN_U16("graphics/misc/mirage_tower_crumbles.gbapal");
const s16 gUnknown_08617D64[][3] =
{
{ 0, 10, 65},
{ 17, 3, 50},
{-12, 0, 75},
{ 10, 15, 90},
{ 7, 8, 65},
{-18, 5, 75},
{ 22, -10, 55},
{-24, -4, 65},
};
const struct SpriteSheet gUnknown_08617D94[] =
{
{gMirageTowerCrumbles_Gfx, 0x0080, 0x0fa0},
{NULL}
};
static const struct Struct8617DA4 gUnknown_08617DA4[] =
{
{0x12, 0x35, 0x251},
{0x13, 0x35, 0x251},
{0x14, 0x35, 0x251},
{0x12, 0x36, 0x251},
{0x13, 0x36, 0x251},
{0x14, 0x36, 0x251},
{0x12, 0x37, 0x251},
{0x13, 0x37, 0x251},
{0x14, 0x37, 0x251},
{0x12, 0x38, 0x251},
{0x13, 0x38, 0x251},
{0x14, 0x38, 0x251},
{0x12, 0x39, 0x259},
{0x13, 0x39, 0x259},
{0x14, 0x39, 0x259},
{0x12, 0x3A, 0x121},
{0x13, 0x3A, 0x121},
{0x14, 0x3A, 0x121},
};
static const union AnimCmd gSpriteAnim_8617DEC[] =
{
ANIMCMD_FRAME(0, 1),
ANIMCMD_END,
};
static const struct OamData gOamData_8617DF4 =
{
.y = 0,
.affineMode = 0,
.objMode = 0,
.mosaic = 0,
.bpp = 0,
.shape = 0,
.x = 0,
.matrixNum = 0,
.size = 1,
.tileNum = 0,
.priority = 0,
.paletteNum = 3,
.affineParam = 0,
};
static const union AnimCmd *const gSpriteAnimTable_8617DFC[] =
{
gSpriteAnim_8617DEC,
};
static const struct SpriteTemplate gUnknown_08617E00 = {
0xFFFF, 0xFFFF, &gOamData_8617DF4, gSpriteAnimTable_8617DFC, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
};
// ewram
EWRAM_DATA u8* gUnknown_0203CF04 = NULL;
EWRAM_DATA u8* gUnknown_0203CF08 = NULL;
EWRAM_DATA struct Struct203CF0C *gUnknown_0203CF0C = NULL;
EWRAM_DATA struct Struct203CF10 *gUnknown_0203CF10 = NULL;
EWRAM_DATA u16 *gUnknown_0203CF14 = NULL;
// iwram
IWRAM_DATA u16 gUnknown_030012A8[8] = {0, 0, 0, 0, 0, 0, 0, 0};
// text
void sub_81BEB24(void)
{
u8 i;
for(i = 0; i < (sizeof(gUnknown_08617DA4)/sizeof(gUnknown_08617DA4[0])); i++)
MapGridSetMetatileIdAt(gUnknown_08617DA4[i].x + 7, gUnknown_08617DA4[i].y + 7, gUnknown_08617DA4[i].tileId);
DrawWholeMapView();
}
void sub_81BEB54(void)
{
CreateTask(sub_81BED50, 0x9);
}
void sub_81BEB68(void)
{
CreateTask(sub_81BEBF4, 0x9);
}
void sub_81BEB7C(void)
{
CreateTask(sub_81BF028, 0x9);
}
void sub_81BEB90(void)
{
SetGpuReg(REG_OFFSET_BG0HOFS, gUnknown_0203CF14[0]);
SetGpuReg(REG_OFFSET_BG0VOFS, gUnknown_0203CF14[1]);
}
void sub_81BEBB4(u8 taskId)
{
if(!(gTasks[taskId].data[0]))
{
gUnknown_0203CF14[0] = -gUnknown_0203CF14[0];
gTasks[taskId].data[0] = 2;
sub_81BEB90();
}
else
gTasks[taskId].data[0]--;
}
static void sub_81BEBF4(u8 taskId)
{
u8 zero;
switch(gTasks[taskId].data[0])
{
case 0:
FreeAllWindowBuffers();
SetBgAttribute(0, BG_CTRL_ATTR_MOSAIC, 2);
gTasks[taskId].data[0]++;
break;
case 1:
gUnknown_0203CF04 = (u8 *)AllocZeroed(MIRAGE_TOWER_GFX_LENGTH);
gUnknown_0203CF08 = (u8 *)AllocZeroed(MIRAGE_TOWER_PALETTE_LENGTH);
ChangeBgX(0, 0, 0);
ChangeBgY(0, 0, 0);
gTasks[taskId].data[0]++;
break;
case 2:
CpuSet(gUnknown_08617274, gUnknown_0203CF04, MIRAGE_TOWER_GFX_LENGTH / 2);
LoadBgTiles(0, gUnknown_0203CF04, MIRAGE_TOWER_GFX_LENGTH, 0);
gTasks[taskId].data[0]++;
break;
case 3:
SetBgTilemapBuffer(0, gUnknown_0203CF08);
CopyToBgTilemapBufferRect_ChangePalette(0, &gUnknown_08617B94, 12, 29, 6, 12, 17);
CopyBgTilemapBufferToVram(0);
gTasks[taskId].data[0]++;
break;
case 4:
ShowBg(0);
gTasks[taskId].data[0]++;
break;
case 5:
sub_81BEB24();
gTasks[taskId].data[0]++;
break;
case 6:
gUnknown_0203CF14 = (u16 *)Alloc(4);
zero = 0;
gUnknown_0203CF14[0] = 2;
gUnknown_0203CF14[1] = zero;
CreateTask(sub_81BEBB4, 0xA);
DestroyTask(taskId);
EnableBothScriptContexts();
break;
}
}
#ifdef NONMATCHING
#define OUTER_BUFFER_LENGTH 0x60
#define INNER_BUFFER_LENGTH 0x30
static void sub_81BED50(u8 taskId)
{
u8 anotherTaskId, j;
switch(gTasks[taskId].data[0])
{
case 1:
gUnknown_0203CF10 = (struct Struct203CF10 *)AllocZeroed(OUTER_BUFFER_LENGTH * sizeof(struct Struct203CF10));
break;
case 3:
{
u16 i;
u16 left;
u32 index, next;
index = (u16)gTasks[taskId].data[3];
if(gTasks[taskId].data[3] <= (OUTER_BUFFER_LENGTH - 1))
{
if(gTasks[taskId].data[1] > 1)
{
index = (u8)index;
gUnknown_0203CF10[index].buffer = (u8 *)Alloc(INNER_BUFFER_LENGTH);
for(i = 0; i <= (INNER_BUFFER_LENGTH - 1); i++)
gUnknown_0203CF10[index].buffer[i] = i;
for(i = 0; i <= (INNER_BUFFER_LENGTH - 1); i++)
{
u16 rand1, rand2, temp;
rand1 = Random() % 0x30;
rand2 = Random() % 0x30;
temp = gUnknown_0203CF10[index].buffer[rand2];
gUnknown_0203CF10[index].buffer[rand2] = gUnknown_0203CF10[index].buffer[rand1];
gUnknown_0203CF10[index].buffer[rand1] = temp;
}
if(gTasks[taskId].data[3] <= (OUTER_BUFFER_LENGTH - 1))
gTasks[taskId].data[3]++;
gTasks[taskId].data[1] = 0;
}
gTasks[taskId].data[1]++;
}
index = (u8)gTasks[taskId].data[3];
for(left = (u8)gTasks[taskId].data[2]; left < (u16)index; left = next)
{
j = 0;
next = left + 1;
while(!j)
{
sub_81BF2B8(gUnknown_0203CF04, ((((OUTER_BUFFER_LENGTH - 1) - left) * INNER_BUFFER_LENGTH) + gUnknown_0203CF10[left].buffer[(gUnknown_0203CF10[left].curr_buffer_index)++]), 0, INNER_BUFFER_LENGTH, 1);
j++;
}
if(gUnknown_0203CF10[left].curr_buffer_index > (INNER_BUFFER_LENGTH - 1))
{
FREE_AND_SET_NULL(gUnknown_0203CF10[left].buffer);
gTasks[taskId].data[2]++;
if((left % 2) == 1)
gUnknown_0203CF14[1]--;
}
}
LoadBgTiles(0, gUnknown_0203CF04, MIRAGE_TOWER_GFX_LENGTH, 0);
if(gUnknown_0203CF10[OUTER_BUFFER_LENGTH - 1].curr_buffer_index > (INNER_BUFFER_LENGTH - 1))
break;
return;
}
case 4:
UnsetBgTilemapBuffer(0);
anotherTaskId = FindTaskIdByFunc(sub_81BEBB4);
if(anotherTaskId != 0xFF)
DestroyTask(anotherTaskId);
gUnknown_0203CF14[1] = gUnknown_0203CF14[0] = 0;
sub_81BEB90();
break;
case 5:
FREE_AND_SET_NULL(gUnknown_0203CF14);
FREE_AND_SET_NULL(gUnknown_0203CF10);
FREE_AND_SET_NULL(gUnknown_0203CF04);
FREE_AND_SET_NULL(gUnknown_0203CF08);
break;
case 6:
SetGpuRegBits(REG_OFFSET_BG2CNT, 0x2);
SetGpuRegBits(REG_OFFSET_BG0CNT, 0x0);
SetBgAttribute(0, BG_CTRL_ATTR_MOSAIC, 0);
sub_81971D0();
break;
case 7:
ShowBg(0);
break;
case 8:
DestroyTask(taskId);
EnableBothScriptContexts();
break;
}
gTasks[taskId].data[0]++;
}
#else
ASM_DIRECT
static void sub_81BED50(u8 taskId)
{
asm("\n\
.syntax unified\n\
push {r4-r7,lr}\n\
mov r7, r10\n\
mov r6, r9\n\
mov r5, r8\n\
push {r5-r7}\n\
sub sp, 0x10\n\
lsls r0, 24\n\
lsrs r0, 24\n\
mov r10, r0\n\
ldr r1, =gTasks\n\
lsls r0, 2\n\
add r0, r10\n\
lsls r0, 3\n\
adds r0, r1\n\
ldrh r0, [r0, 0x8]\n\
subs r0, 0x1\n\
lsls r0, 16\n\
asrs r0, 16\n\
adds r6, r1, 0\n\
cmp r0, 0x7\n\
bls _081BED7C\n\
b _081BF002\n\
_081BED7C:\n\
lsls r0, 2\n\
ldr r1, =_081BED90\n\
adds r0, r1\n\
ldr r0, [r0]\n\
mov pc, r0\n\
.pool\n\
.align 2, 0\n\
_081BED90:\n\
.4byte _081BEDB0\n\
.4byte _081BF002\n\
.4byte _081BEDC4\n\
.4byte _081BEF64\n\
.4byte _081BEF94\n\
.4byte _081BEFD0\n\
.4byte _081BEFF0\n\
.4byte _081BEFF8\n\
_081BEDB0:\n\
ldr r4, =gUnknown_0203CF10\n\
movs r0, 0xC0\n\
lsls r0, 2\n\
bl AllocZeroed\n\
str r0, [r4]\n\
b _081BF002\n\
.pool\n\
_081BEDC4:\n\
mov r1, r10\n\
lsls r0, r1, 2\n\
adds r1, r0, r1\n\
lsls r1, 3\n\
adds r2, r1, r6\n\
ldrh r3, [r2, 0xE]\n\
movs r4, 0xE\n\
ldrsh r1, [r2, r4]\n\
str r0, [sp, 0x8]\n\
cmp r1, 0x5F\n\
bgt _081BEE8A\n\
movs r1, 0xA\n\
ldrsh r0, [r2, r1]\n\
cmp r0, 0x1\n\
ble _081BEE7C\n\
lsls r0, r3, 24\n\
lsrs r4, r0, 24\n\
movs r0, 0x30\n\
bl Alloc\n\
ldr r3, =gUnknown_0203CF10\n\
ldr r1, [r3]\n\
lsls r2, r4, 3\n\
adds r1, r2, r1\n\
str r0, [r1]\n\
movs r5, 0\n\
adds r4, r2, 0\n\
_081BEDFA:\n\
ldr r0, [r3]\n\
adds r0, r4, r0\n\
ldr r0, [r0]\n\
adds r0, r5\n\
strb r5, [r0]\n\
adds r0, r5, 0x1\n\
lsls r0, 16\n\
lsrs r5, r0, 16\n\
cmp r5, 0x2F\n\
bls _081BEDFA\n\
movs r5, 0\n\
ldr r7, =gUnknown_0203CF10\n\
adds r6, r2, 0\n\
_081BEE14:\n\
bl Random\n\
lsls r0, 16\n\
lsrs r0, 16\n\
movs r1, 0x30\n\
bl __umodsi3\n\
adds r4, r0, 0\n\
lsls r4, 16\n\
lsrs r4, 16\n\
bl Random\n\
lsls r0, 16\n\
lsrs r0, 16\n\
movs r1, 0x30\n\
bl __umodsi3\n\
lsls r0, 16\n\
lsrs r0, 16\n\
ldr r1, [r7]\n\
adds r1, r6, r1\n\
ldr r1, [r1]\n\
adds r0, r1, r0\n\
ldrb r2, [r0]\n\
adds r1, r4 \n\
ldrb r1, [r1]\n\
strb r1, [r0]\n\
ldr r0, [r7]\n\
adds r0, r6, r0\n\
ldr r0, [r0]\n\
adds r0, r4\n\
strb r2, [r0]\n\
adds r0, r5, 0x1\n\
lsls r0, 16\n\
lsrs r5, r0, 16\n\
cmp r5, 0x2F\n\
bls _081BEE14\n\
ldr r0, =gTasks\n\
ldr r1, [sp, 0x8]\n\
add r1, r10\n\
lsls r1, 3\n\
adds r2, r1, r0\n\
ldrh r3, [r2, 0xE]\n\
movs r4, 0xE\n\
ldrsh r1, [r2, r4]\n\
adds r6, r0, 0\n\
cmp r1, 0x5F\n\
bgt _081BEE78\n\
adds r0, r3, 0x1\n\
strh r0, [r2, 0xE]\n\
_081BEE78:\n\
movs r0, 0\n\
strh r0, [r2, 0xA]\n\
_081BEE7C:\n\
ldr r1, [sp, 0x8]\n\
add r1, r10\n\
lsls r1, 3\n\
adds r1, r6\n\
ldrh r0, [r1, 0xA]\n\
adds r0, 0x1\n\
strh r0, [r1, 0xA]\n\
_081BEE8A:\n\
ldr r0, [sp, 0x8]\n\
add r0, r10\n\
lsls r0, 3\n\
adds r0, r6\n\
ldrb r4, [r0, 0xE]\n\
ldrb r5, [r0, 0xC]\n\
lsls r0, r4, 16\n\
cmp r5, r4\n\
bcs _081BEF32\n\
str r0, [sp, 0xC]\n\
_081BEE9E:\n\
movs r6, 0\n\
adds r0, r5, 0x1\n\
str r0, [sp, 0x4]\n\
lsls r4, r5, 3\n\
movs r2, 0x5F\n\
subs r1, r2, r5\n\
lsls r0, r1, 1\n\
adds r0, r1\n\
lsls r0, 4\n\
mov r9, r0\n\
_081BEEB2:\n\
ldr r0, =gUnknown_0203CF04\n\
ldr r0, [r0]\n\
ldr r7, =gUnknown_0203CF10\n\
ldr r3, [r7]\n\
adds r3, r4, r3\n\
ldrb r2, [r3, 0x4]\n\
adds r1, r2, 0x1\n\
strb r1, [r3, 0x4]\n\
lsls r2, 24\n\
lsrs r2, 24\n\
ldr r1, [r3]\n\
adds r1, r2\n\
ldrb r1, [r1]\n\
add r1, r9\n\
lsls r1, 16\n\
lsrs r1, 16\n\
movs r2, 0x1\n\
mov r8, r2\n\
str r2, [sp]\n\
movs r2, 0\n\
movs r3, 0x30\n\
bl sub_81BF2B8\n\
adds r0, r6, 0x1\n\
lsls r0, 24\n\
lsrs r6, r0, 24\n\
cmp r6, 0\n\
beq _081BEEB2\n\
ldr r0, [r7]\n\
adds r1, r4, r0\n\
ldrb r0, [r1, 0x4]\n\
cmp r0, 0x2F\n\
bls _081BEF24\n\
ldr r0, [r1]\n\
bl Free\n\
ldr r0, [r7]\n\
adds r0, r4, r0\n\
movs r1, 0\n\
str r1, [r0]\n\
ldr r1, [sp, 0x8]\n\
add r1, r10\n\
lsls r1, 3\n\
ldr r4, =gTasks\n\
adds r1, r4\n\
ldrh r0, [r1, 0xC]\n\
adds r0, 0x1\n\
strh r0, [r1, 0xC]\n\
mov r0, r8\n\
ands r5, r0\n\
cmp r5, 0x1\n\
bne _081BEF24\n\
ldr r0, =gUnknown_0203CF14\n\
ldr r1, [r0]\n\
ldrh r0, [r1, 0x2]\n\
subs r0, 0x1\n\
strh r0, [r1, 0x2]\n\
_081BEF24:\n\
ldr r1, [sp, 0x4]\n\
lsls r0, r1, 16\n\
lsrs r5, r0, 16\n\
ldr r2, [sp, 0xC]\n\
lsrs r0, r2, 16\n\
cmp r5, r0\n\
bcc _081BEE9E\n\
_081BEF32:\n\
ldr r0, =gUnknown_0203CF04\n\
ldr r1, [r0]\n\
movs r2, 0x92\n\
lsls r2, 4\n\
movs r0, 0\n\
movs r3, 0\n\
bl LoadBgTiles\n\
ldr r0, =gUnknown_0203CF10\n\
ldr r0, [r0]\n\
movs r4, 0xBE\n\
lsls r4, 2\n\
adds r0, r4\n\
ldrb r0, [r0, 0x4]\n\
cmp r0, 0x2F\n\
bhi _081BF002\n\
b _081BF014\n\
.pool\n\
_081BEF64:\n\
movs r0, 0\n\
bl UnsetBgTilemapBuffer\n\
ldr r0, =sub_81BEBB4\n\
bl FindTaskIdByFunc\n\
lsls r0, 24\n\
lsrs r0, 24\n\
cmp r0, 0xFF\n\
beq _081BEF7C\n\
bl DestroyTask\n\
_081BEF7C:\n\
ldr r0, =gUnknown_0203CF14\n\
ldr r1, [r0]\n\
movs r0, 0\n\
strh r0, [r1]\n\
strh r0, [r1, 0x2]\n\
bl sub_81BEB90\n\
b _081BF002\n\
.pool\n\
_081BEF94:\n\
ldr r4, =gUnknown_0203CF14\n\
ldr r0, [r4]\n\
bl Free\n\
movs r5, 0\n\
str r5, [r4]\n\
ldr r4, =gUnknown_0203CF10\n\
ldr r0, [r4]\n\
bl Free\n\
str r5, [r4]\n\
ldr r4, =gUnknown_0203CF04\n\
ldr r0, [r4]\n\
bl Free\n\
str r5, [r4]\n\
ldr r4, =gUnknown_0203CF08\n\
ldr r0, [r4]\n\
bl Free\n\
str r5, [r4]\n\
b _081BF002\n\
.pool\n\
_081BEFD0:\n\
movs r0, 0xC\n\
movs r1, 0x2\n\
bl SetGpuRegBits\n\
movs r0, 0x8\n\
movs r1, 0\n\
bl SetGpuRegBits\n\
movs r0, 0\n\
movs r1, 0x7\n\
movs r2, 0\n\
bl SetBgAttribute\n\
bl sub_81971D0\n\
b _081BF002\n\
_081BEFF0:\n\
movs r0, 0\n\
bl ShowBg\n\
b _081BF002\n\
_081BEFF8:\n\
mov r0, r10\n\
bl DestroyTask\n\
bl EnableBothScriptContexts\n\
_081BF002:\n\
ldr r0, =gTasks\n\
mov r2, r10\n\
lsls r1, r2, 2\n\
add r1, r10\n\
lsls r1, 3\n\
adds r1, r0\n\
ldrh r0, [r1, 0x8]\n\
adds r0, 0x1\n\
strh r0, [r1, 0x8]\n\
_081BF014:\n\
add sp, 0x10\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");
}
#endif // NONMATCHING
static void sub_81BF028(u8 taskId)
{
u16 i;
switch(gTasks[taskId].data[0])
{
case 1:
gUnknown_0203CF0C = (struct Struct203CF0C *)AllocZeroed(sizeof(struct Struct203CF0C));
gUnknown_0203CF0C->frameImageTiles = (u8 *)AllocZeroed(ROOT_FOSSIL_GFX_LENGTH);
gUnknown_0203CF0C->frameImage = (struct DynamicSpriteFrameImage *) AllocZeroed(sizeof(struct DynamicSpriteFrameImage));
gUnknown_0203CF0C->unkC = (u16 *)AllocZeroed(ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH * sizeof(u16));
gUnknown_0203CF0C->unk10 = 0;
break;
case 2:
{
u8 *buffer;
buffer = gUnknown_0203CF0C->frameImageTiles;
for(i = 0; i < ROOT_FOSSIL_GFX_LENGTH; i++, buffer++)
*buffer = gRootFossil_Gfx[i];
}
break;
case 3:
gUnknown_0203CF0C->frameImage->data = gUnknown_0203CF0C->frameImageTiles;
gUnknown_0203CF0C->frameImage->size = ROOT_FOSSIL_GFX_LENGTH;
break;
case 4:
{
u8 spriteId, zero;
struct SpriteTemplate fossilTemplate;
fossilTemplate = gUnknown_08617E00;
fossilTemplate.images = (struct SpriteFrameImage *)(gUnknown_0203CF0C->frameImage);
spriteId = CreateSprite(&fossilTemplate, 128, -16, 1);
gUnknown_0203CF0C->spriteId = spriteId;
zero = 0;
gSprites[gUnknown_0203CF0C->spriteId].centerToCornerVecX = zero;
gSprites[gUnknown_0203CF0C->spriteId].data[0] = gSprites[gUnknown_0203CF0C->spriteId].pos1.x;
gSprites[gUnknown_0203CF0C->spriteId].data[1] = 1;
}
case 5:
for(i = 0; i < ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH; i++)
gUnknown_0203CF0C->unkC[i] = i;
break;
case 6:
{
u16 rand1, rand2, temp, j;
j = (ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH * sizeof(u16)) - 1;
for(i = 0; i <= j; i++)
{
rand1 = Random() % 0x100;
rand2 = Random() % 0x100;
j = (ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH * sizeof(u16)) - 1;
temp = gUnknown_0203CF0C->unkC[rand2];
gUnknown_0203CF0C->unkC[rand2] = gUnknown_0203CF0C->unkC[rand1];
gUnknown_0203CF0C->unkC[rand1] = temp;
}
gSprites[gUnknown_0203CF0C->spriteId].callback = sub_81BF248;
break;
}
case 7:
if(gSprites[gUnknown_0203CF0C->spriteId].callback != SpriteCallbackDummy)
return;
DestroySprite(&gSprites[gUnknown_0203CF0C->spriteId]);
FREE_AND_SET_NULL(gUnknown_0203CF0C->unkC);;
FREE_AND_SET_NULL(gUnknown_0203CF0C->frameImage);
FREE_AND_SET_NULL(gUnknown_0203CF0C->frameImageTiles);
FREE_AND_SET_NULL(gUnknown_0203CF0C);
break;
case 8:
EnableBothScriptContexts();
}
++gTasks[taskId].data[0];
}
static void sub_81BF248(struct Sprite *sprite)
{
if (gUnknown_0203CF0C->unk10 >= (ROOT_FOSSIL_GFX_RANDOMIZER_LENGTH))
{
sprite->callback = SpriteCallbackDummy;
}
else if (sprite->pos1.y >= 0x60)
{
u8 i;
for (i = 0; i < 2; i++)
{
sub_81BF2B8(gUnknown_0203CF0C->frameImageTiles, gUnknown_0203CF0C->unkC[gUnknown_0203CF0C->unk10++], 0, 16, 0);
}
StartSpriteAnim(sprite, 0);
}
else
{
sprite->pos1.y++;
}
}

106
src/gym_leader_rematch.c Normal file
View File

@@ -0,0 +1,106 @@
#include "global.h"
#include "constants/flags.h"
#include "random.h"
#include "event_data.h"
#include "battle_setup.h"
#include "gym_leader_rematch.h"
static void UpdateGymLeaderRematchFromArray(const u16 *data, size_t size, u32 maxRematch);
static s32 GetRematchIndex(u32 trainerIdx);
static const u16 GymLeaderRematches_AfterNewMauville[] = {
REMATCH_ROXANNE,
REMATCH_BRAWLY,
REMATCH_WATTSON,
REMATCH_FLANNERY,
REMATCH_NORMAN,
REMATCH_WINONA,
REMATCH_TATE_AND_LIZA,
REMATCH_JUAN
};
static const u16 GymLeaderRematches_BeforeNewMauville[] = {
REMATCH_ROXANNE,
REMATCH_BRAWLY,
// Wattson isn't available at this time
REMATCH_FLANNERY,
REMATCH_NORMAN,
REMATCH_WINONA,
REMATCH_TATE_AND_LIZA,
REMATCH_JUAN
};
void UpdateGymLeaderRematch(void)
{
if (FlagGet(FLAG_SYS_GAME_CLEAR) && (Random() % 100) <= 30)
{
if (FlagGet(FLAG_WATTSON_REMATCH_AVAILABLE))
UpdateGymLeaderRematchFromArray(GymLeaderRematches_AfterNewMauville, ARRAY_COUNT(GymLeaderRematches_AfterNewMauville), 5);
else
UpdateGymLeaderRematchFromArray(GymLeaderRematches_BeforeNewMauville, ARRAY_COUNT(GymLeaderRematches_BeforeNewMauville), 1);
}
}
static void UpdateGymLeaderRematchFromArray(const u16 *data, size_t size, u32 maxRematch)
{
s32 whichLeader = 0;
s32 lowestRematchIndex = 5;
u32 i;
s32 rematchIndex;
for (i = 0; i < size; i++)
{
if (!gSaveBlock1Ptr->trainerRematches[data[i]])
{
rematchIndex = GetRematchIndex(data[i]);
if (lowestRematchIndex > rematchIndex)
lowestRematchIndex = rematchIndex;
whichLeader++;
}
}
if (whichLeader != 0 && lowestRematchIndex <= maxRematch)
{
whichLeader = 0;
for (i = 0; i < size; i++)
{
if (!gSaveBlock1Ptr->trainerRematches[data[i]])
{
rematchIndex = GetRematchIndex(data[i]);
if (rematchIndex == lowestRematchIndex)
whichLeader++;
}
}
if (whichLeader != 0)
{
whichLeader = Random() % whichLeader;
for (i = 0; i < size; i++)
{
if (!gSaveBlock1Ptr->trainerRematches[data[i]])
{
rematchIndex = GetRematchIndex(data[i]);
if (rematchIndex == lowestRematchIndex)
{
if (whichLeader == 0)
{
gSaveBlock1Ptr->trainerRematches[data[i]] = lowestRematchIndex;
break;
}
whichLeader--;
}
}
}
}
}
}
static s32 GetRematchIndex(u32 trainerIdx)
{
s32 i;
for (i = 0; i < 5; i++)
{
if (!HasTrainerBeenFought(gRematchTable[trainerIdx].trainerIds[i]))
{
return i;
}
}
return 5;
}

View File

@@ -328,7 +328,6 @@ extern u8* gReturnToXStringsTable[];
extern u32 gUnknown_0203CE5E[];
extern u8 EventScript_2736B3[];
extern const u16 gUnknown_0860F074[];
extern struct BattleMove gBattleMoves[];
void ResetBagScrollPositions(void)
{

View File

@@ -606,7 +606,6 @@ u8 sub_818E06C(void)
}
}
#ifdef NONMATCHING
static u8 sub_818E13C(void)
{
u8 retval;
@@ -627,9 +626,11 @@ static u8 sub_818E13C(void)
len = sub_818E258(gUnknown_0203CD68->playerName);
if (len == sub_818E258(gSaveBlock2Ptr->playerName))
{
u8 *name = gUnknown_0203CD68->playerName;
for (i = 0; i < len; i ++)
{
if (gUnknown_0203CD68->playerName[i] != gSaveBlock2Ptr->playerName[i])
name = gUnknown_0203CD68->playerName;
if (name[i] != gSaveBlock2Ptr->playerName[i])
{
retval = 2;
break;
@@ -640,85 +641,6 @@ static u8 sub_818E13C(void)
}
return retval;
}
#else
ASM_DIRECT static u8 sub_818E13C(void)
{
asm_unified("\tpush {r4-r7,lr}\n"
"\tmovs r7, 0x1\n"
"\tldr r5, =gUnknown_0203CD68\n"
"\tldr r0, =gSaveBlock1Ptr\n"
"\tldr r1, [r0]\n"
"\tldr r2, =0x00003b58\n"
"\tadds r0, r1, r2\n"
"\tstr r0, [r5]\n"
"\tldrb r0, [r0, 0x18]\n"
"\tcmp r0, 0xFF\n"
"\tbne _0818E174\n"
"\tldr r0, =gStringVar1\n"
"\tldr r1, =gText_Lady2\n"
"\tbl StringCopy7\n"
"\tmovs r7, 0\n"
"\tb _0818E1DC\n"
"\t.pool\n"
"_0818E174:\n"
"\tldr r4, =gStringVar1\n"
"\tldr r0, =0x00003b70\n"
"\tadds r1, r0\n"
"\tadds r0, r4, 0\n"
"\tbl StringCopy7\n"
"\tldr r0, [r5]\n"
"\tadds r0, 0x2D\n"
"\tldrb r1, [r0]\n"
"\tadds r0, r4, 0\n"
"\tbl ConvertInternationalString\n"
"\tldr r0, [r5]\n"
"\tadds r0, 0x18\n"
"\tbl sub_818E258\n"
"\tlsls r0, 24\n"
"\tlsrs r4, r0, 24\n"
"\tldr r6, =gSaveBlock2Ptr\n"
"\tldr r0, [r6]\n"
"\tbl sub_818E258\n"
"\tlsls r0, 24\n"
"\tlsrs r0, 24\n"
"\tcmp r4, r0\n"
"\tbne _0818E1DC\n"
"\tldr r0, [r5]\n"
"\tmovs r2, 0\n"
"\tcmp r2, r4\n"
"\tbcs _0818E1DC\n"
"\tldr r1, [r6]\n"
"\tldrb r0, [r0, 0x18]\n"
"\tldrb r1, [r1]\n"
"\tcmp r0, r1\n"
"\tbne _0818E1DA\n"
"_0818E1BA:\n"
"\tadds r0, r2, 0x1\n"
"\tlsls r0, 24\n"
"\tlsrs r2, r0, 24\n"
"\tcmp r2, r4\n"
"\tbcs _0818E1DC\n"
"\tldr r0, =gUnknown_0203CD68\n"
"\tldr r1, [r0]\n"
"\tadds r1, 0x18\n"
"\tadds r1, r2\n"
"\tldr r0, =gSaveBlock2Ptr\n"
"\tldr r0, [r0]\n"
"\tadds r0, r2\n"
"\tldrb r1, [r1]\n"
"\tldrb r0, [r0]\n"
"\tcmp r1, r0\n"
"\tbeq _0818E1BA\n"
"_0818E1DA:\n"
"\tmovs r7, 0x2\n"
"_0818E1DC:\n"
"\tadds r0, r7, 0\n"
"\tpop {r4-r7}\n"
"\tpop {r1}\n"
"\tbx r1\n"
"\t.pool");
}
#endif
static u8 sub_818E1F4(void)
{

View File

@@ -67,7 +67,6 @@ extern const union AnimCmd *gUnknown_082FF70C[];
extern const union AnimCmd *const *const gMonAnimationsSpriteAnimsPtrTable[];
extern const union AnimCmd *const *const gUnknown_08305D0C[];
extern const union AnimCmd *const *const gUnknown_0830536C[];
extern const struct BattleMove gBattleMoves[];
extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1];
extern const struct UnknownPokemonStruct3 gUnknown_08610970[];
extern const struct CompressedSpritePalette gMonPaletteTable[];
@@ -110,6 +109,9 @@ EWRAM_DATA struct SpriteTemplate gUnknown_0202499C = {0};
EWRAM_DATA struct Unknown_806F160_Struct *gUnknown_020249B4[2] = {NULL};
// const rom data
#include "data/battle_moves.h"
static const u8 sUnreferencedData[] = {0x34, 0x00, 0x10, 0x00, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00};
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};
@@ -2196,7 +2198,7 @@ void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move)
(var) /= (gStatStageRatios)[(mon)->statStages[(statIndex)]][1]; \
}
s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 sideStatus, u16 powerOverride, u8 typeOverride, u8 bankAtk, u8 bankDef)
s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 sideStatus, u16 powerOverride, u8 typeOverride, u8 battlerIdAtk, u8 battlerIdDef)
{
u32 i;
s32 damage = 0;
@@ -2226,8 +2228,8 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
if (attacker->item == ITEM_ENIGMA_BERRY)
{
attackerHoldEffect = gEnigmaBerries[bankAtk].holdEffect;
attackerHoldEffectParam = gEnigmaBerries[bankAtk].holdEffectParam;
attackerHoldEffect = gEnigmaBerries[battlerIdAtk].holdEffect;
attackerHoldEffectParam = gEnigmaBerries[battlerIdAtk].holdEffectParam;
}
else
{
@@ -2237,8 +2239,8 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
if (defender->item == ITEM_ENIGMA_BERRY)
{
defenderHoldEffect = gEnigmaBerries[bankDef].holdEffect;
defenderHoldEffectParam = gEnigmaBerries[bankDef].holdEffectParam;
defenderHoldEffect = gEnigmaBerries[battlerIdDef].holdEffect;
defenderHoldEffectParam = gEnigmaBerries[battlerIdDef].holdEffectParam;
}
else
{
@@ -2249,13 +2251,13 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
if (attacker->ability == ABILITY_HUGE_POWER || attacker->ability == ABILITY_PURE_POWER)
attack *= 2;
if (ShouldGetStatBadgeBoost(FLAG_BADGE01_GET, bankAtk))
if (ShouldGetStatBadgeBoost(FLAG_BADGE01_GET, battlerIdAtk))
attack = (110 * attack) / 100;
if (ShouldGetStatBadgeBoost(FLAG_BADGE05_GET, bankDef))
if (ShouldGetStatBadgeBoost(FLAG_BADGE05_GET, battlerIdDef))
defense = (110 * defense) / 100;
if (ShouldGetStatBadgeBoost(FLAG_BADGE07_GET, bankAtk))
if (ShouldGetStatBadgeBoost(FLAG_BADGE07_GET, battlerIdAtk))
spAttack = (110 * spAttack) / 100;
if (ShouldGetStatBadgeBoost(FLAG_BADGE07_GET, bankDef))
if (ShouldGetStatBadgeBoost(FLAG_BADGE07_GET, battlerIdDef))
spDefense = (110 * spDefense) / 100;
for (i = 0; i < ARRAY_COUNT(sHoldEffectToType); i++)
@@ -2440,7 +2442,7 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
}
// flash fire triggered
if ((gBattleResources->flags->flags[bankAtk] & UNKNOWN_FLAG_FLASH_FIRE) && type == TYPE_FIRE)
if ((gBattleResources->flags->flags[battlerIdAtk] & UNKNOWN_FLAG_FLASH_FIRE) && type == TYPE_FIRE)
damage = (15 * damage) / 10;
}

View File

@@ -115,8 +115,6 @@ extern u8 gText_Appeal[];
extern u8 gText_Jam[];
extern u8 gText_OTSlash[];
extern u8 gText_UnkCtrlF907F908[];
extern u8 gAbilityNames[][13];
extern u8 *gAbilityDescriptionPointers[];
extern u8 gText_XNature[];
extern u8 gText_XNatureHatchedAtYZ[];
extern u8 gText_XNatureHatchedSomewhereAt[];
@@ -146,7 +144,6 @@ extern u8 gText_OneDash[];
extern u8 gText_TwoDashes[];
extern u8 gText_ThreeDashes[];
extern u8 gUnknown_0861CE97[];
extern struct BattleMove gBattleMoves[];
extern void sub_8199C30(u8 a, u8 b, u8 c, u8 d, u8 e, u8 f);
extern bool8 sub_81A6BF4();
@@ -2539,7 +2536,7 @@ void sub_81C2554()
gUnknown_0203CF1C->unk40CB[i] |= 0xFF;
}
void sub_81C25A4(u8 a, u8 *b, u8 c, u8 d, u8 e, u8 f)
void sub_81C25A4(u8 a, const u8 *b, u8 c, u8 d, u8 e, u8 f)
{
AddTextPrinterParameterized2(a, 1, c, d, 0, e, gUnknown_0861CD2C[f], 0, b);
}

View File

@@ -1612,7 +1612,7 @@ bool8 ScrCmd_buffernumberstring(struct ScriptContext *ctx)
{
u8 stringVarIndex = ScriptReadByte(ctx);
u16 v1 = VarGet(ScriptReadHalfword(ctx));
u8 v2 = sub_80EF370(v1);
u8 v2 = CountDigits(v1);
ConvertIntToDecimalStringN(sScriptStringVars[stringVarIndex], v1, 0, v2);
return FALSE;

View File

@@ -4,18 +4,15 @@
#include "m4a.h"
#include "palette.h"
#include "sound.h"
#include "constants/songs.h"
#include "string_util.h"
#include "window.h"
#include "text.h"
#include "blit.h"
extern void FillBitmapRect4Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue);
extern void FillWindowPixelRect(u8 windowId, u8 fillValue, u16 x, u16 y, u16 width, u16 height);
extern void BlitBitmapRectToWindow(u8 windowId, const u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight);
extern u8 GetKeypadIconWidth(u8 keypadIconId);
extern void CopyWindowToVram(u8 windowId, u8 mode);
extern u16 Font6Func(struct TextPrinter *textPrinter);
extern u32 GetGlyphWidthFont6(u16 glyphId, bool32 isJapanese);
extern void PlaySE(u16 songNum);
extern u8* UnkTextUtil_GetPtrI(u8 a1);
extern int sub_8197964();
@@ -27,7 +24,6 @@ static u16 gLastTextBgColor;
static u16 gLastTextFgColor;
static u16 gLastTextShadowColor;
extern struct Main gMain;
extern struct MusicPlayerInfo gMPlayInfo_BGM;
const struct FontInfo *gFonts;
@@ -1986,7 +1982,7 @@ bool16 TextPrinterWaitWithDownArrow(struct TextPrinter *textPrinter)
if (gMain.newKeys & (A_BUTTON | B_BUTTON))
{
result = TRUE;
PlaySE(5);
PlaySE(SE_SELECT);
}
}
return result;
@@ -2004,7 +2000,7 @@ bool16 TextPrinterWait(struct TextPrinter *textPrinter)
if (gMain.newKeys & (A_BUTTON | B_BUTTON))
{
result = TRUE;
PlaySE(5);
PlaySE(SE_SELECT);
}
}
return result;

483
src/tv.c

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,8 @@
#include "global.h"
#include "window.h"
#include "malloc.h"
#include "bg.h"
#include "blit.h"
u32 filler_03002F58;
u32 filler_03002F5C;
@@ -15,19 +17,6 @@ EWRAM_DATA struct Window gWindows[WINDOWS_MAX] = {0};
EWRAM_DATA static struct Window* sWindowPtr = NULL;
EWRAM_DATA static u16 sWindowSize = 0;
extern void* GetBgTilemapBuffer(u8 bg);
extern int DummiedOutFireRedLeafGreenTileAllocFunc(int, int, int, int);
extern u16 GetBgAttribute(u8 bg, u8 attributeId);
extern void SetBgTilemapBuffer(u8 bg, void *tilemap);
extern void CopyBgTilemapBufferToVram(u8 bg);
extern u8 LoadBgTiles(u8 bg, void *src, u16 size, u16 destOffset);
extern void WriteSequenceToBgTilemapBuffer(u8 bg, u16 firstTileNum, u8 x, u8 y, u8 width, u8 height, u8 paletteSlot, u16 tileNumDelta);
extern void FillBgTilemapBufferRect(u8 bg, u16 tileNum, u8 x, u8 y, u8 width, u8 height, u8 palette);
extern void BlitBitmapRect4Bit(struct Bitmap *src, struct Bitmap *dest, u16 srcX, u16 srcY, u16 destX, u16 destY, u16 width, u16 height, u8 colorKey);
extern void BlitBitmapRect4BitTo8Bit(struct Bitmap *src, struct Bitmap *dest, u16 srcX, u16 srcY, u16 destX, u16 destY, u16 width, u16 height, u8 colorKey, u8 paletteNum);
extern void FillBitmapRect4Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue);
extern void FillBitmapRect8Bit(struct Bitmap *surface, u16 x, u16 y, u16 width, u16 height, u8 fillValue);
static u8 GetNumActiveWindowsOnBg(u8 bgId);
static u8 GetNumActiveWindowsOnBg8Bit(u8 bgId);
@@ -130,13 +119,13 @@ u16 AddWindow(const struct WindowTemplate *template)
u8 *allocatedTilemapBuffer;
int i;
for (win = 0; win < 0x20; ++win)
for (win = 0; win < WINDOWS_MAX; ++win)
{
if ((bgLayer = gWindows[win].window.priority) == 0xFF)
break;
}
if (win == 0x20)
if (win == WINDOWS_MAX)
return 0xFF;
bgLayer = template->priority;
@@ -199,13 +188,13 @@ int AddWindowWithoutTileMap(const struct WindowTemplate *template)
u8 bgLayer;
int allocatedBaseBlock;
for (win = 0; win < 0x20; ++win)
for (win = 0; win < WINDOWS_MAX; ++win)
{
if (gWindows[win].window.priority == 0xFF)
break;
}
if (win == 0x20)
if (win == WINDOWS_MAX)
return 0xFF;
bgLayer = template->priority;