Merge branch 'master' into record_mixing

This commit is contained in:
PikalaxALT
2018-02-11 20:12:40 -05:00
6672 changed files with 937954 additions and 212286 deletions
File diff suppressed because it is too large Load Diff
+186 -203
View File
@@ -1,30 +1,16 @@
#include "global.h"
#include "battle.h"
#include "battle_controllers.h"
#include "abilities.h"
#include "moves.h"
#include "constants/abilities.h"
#include "constants/moves.h"
#include "pokemon.h"
#include "species.h"
#include "rng.h"
#include "constants/species.h"
#include "random.h"
#include "util.h"
#include "items.h"
#include "constants/items.h"
#include "pokemon_item_effects.h"
extern u8 gActiveBank;
extern u8 gAbsentBankFlags;
extern u32 gBattleTypeFlags;
extern u32 gStatuses3[BATTLE_BANKS_COUNT];
extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT];
extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
extern u16 gUnknown_02024250[BATTLE_BANKS_COUNT];
extern u8 gUnknown_02024270[BATTLE_BANKS_COUNT];
extern u16 gDynamicBasePower;
extern u8 gBattleMoveFlags;
extern u8 gCritMultiplier;
extern s32 gBattleMoveDamage;
extern const struct BattleMove gBattleMoves[];
extern const struct BaseStats gBaseStats[];
extern const u8 gTypeEffectiveness[];
extern const u8 * const gItemEffectTable[]; // todo: fix once struct is declared
@@ -35,11 +21,11 @@ static bool8 ShouldUseItem(void);
static bool8 ShouldSwitchIfPerishSong(void)
{
if (gStatuses3[gActiveBank] & STATUS3_PERISH_SONG
&& gDisableStructs[gActiveBank].perishSong1 == 0)
if (gStatuses3[gActiveBattler] & STATUS3_PERISH_SONG
&& gDisableStructs[gActiveBattler].perishSongTimer1 == 0)
{
*(gBattleStruct->field_294 + gActiveBank) = 6;
EmitTwoReturnValues(1, ACTION_SWITCH, 0);
*(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = 6;
BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
}
@@ -48,7 +34,7 @@ static bool8 ShouldSwitchIfPerishSong(void)
static bool8 ShouldSwitchIfWonderGuard(void)
{
u8 opposingIdentity;
u8 opposingPosition;
u8 opposingBank;
u8 moveFlags;
s32 i, j;
@@ -60,27 +46,27 @@ static bool8 ShouldSwitchIfWonderGuard(void)
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
return FALSE;
opposingIdentity = GetBankIdentity(gActiveBank) ^ BIT_SIDE;
opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(gActiveBattler));
if (gBattleMons[GetBankByIdentity(opposingIdentity)].ability != ABILITY_WONDER_GUARD)
if (gBattleMons[GetBattlerAtPosition(opposingPosition)].ability != ABILITY_WONDER_GUARD)
return FALSE;
// check if pokemon has a super effective move
for (opposingBank = GetBankByIdentity(opposingIdentity), i = 0; i < 4; i++)
for (opposingBank = GetBattlerAtPosition(opposingPosition), i = 0; i < 4; i++)
{
move = gBattleMons[gActiveBank].moves[i];
move = gBattleMons[gActiveBattler].moves[i];
if (move == MOVE_NONE)
continue;
moveFlags = AI_TypeCalc(move, gBattleMons[opposingBank].species, gBattleMons[opposingBank].ability);
if (moveFlags & MOVESTATUS_SUPEREFFECTIVE)
if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE)
return FALSE;
}
// get party information
if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
{
if ((gActiveBank & BIT_MON) == 0)
if ((gActiveBattler & BIT_FLANK) == 0)
firstId = 0, lastId = 3;
else
firstId = 3, lastId = 6;
@@ -90,7 +76,7 @@ static bool8 ShouldSwitchIfWonderGuard(void)
firstId = 0, lastId = 6;
}
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
@@ -104,24 +90,24 @@ static bool8 ShouldSwitchIfWonderGuard(void)
continue;
if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG)
continue;
if (i == gBattlePartyID[gActiveBank])
if (i == gBattlerPartyIndexes[gActiveBattler])
continue;
GetMonData(&party[i], MON_DATA_SPECIES); // unused return value
GetMonData(&party[i], MON_DATA_ALT_ABILITY); // unused return value
for (opposingBank = GetBankByIdentity(opposingIdentity), j = 0; j < 4; j++)
for (opposingBank = GetBattlerAtPosition(opposingPosition), j = 0; j < 4; j++)
{
move = GetMonData(&party[i], MON_DATA_MOVE1 + j);
if (move == MOVE_NONE)
continue;
moveFlags = AI_TypeCalc(move, gBattleMons[opposingBank].species, gBattleMons[opposingBank].ability);
if (moveFlags & MOVESTATUS_SUPEREFFECTIVE && Random() % 3 < 2)
if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && Random() % 3 < 2)
{
// we found a mon
*(gBattleStruct->field_294 + gActiveBank) = i;
EmitTwoReturnValues(1, ACTION_SWITCH, 0);
*(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = i;
BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
}
}
@@ -141,42 +127,42 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void)
if (HasSuperEffectiveMoveAgainstOpponents(TRUE) && Random() % 3 != 0)
return FALSE;
if (gUnknown_02024250[gActiveBank] == 0)
if (gLastLandedMoves[gActiveBattler] == 0)
return FALSE;
if (gUnknown_02024250[gActiveBank] == 0xFFFF)
if (gLastLandedMoves[gActiveBattler] == 0xFFFF)
return FALSE;
if (gBattleMoves[gUnknown_02024250[gActiveBank]].power == 0)
if (gBattleMoves[gLastLandedMoves[gActiveBattler]].power == 0)
return FALSE;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
bankIn1 = gActiveBank;
if (gAbsentBankFlags & gBitTable[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)])
bankIn2 = gActiveBank;
bankIn1 = gActiveBattler;
if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))])
bankIn2 = gActiveBattler;
else
bankIn2 = GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON);
bankIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)));
}
else
{
bankIn1 = gActiveBank;
bankIn2 = gActiveBank;
bankIn1 = gActiveBattler;
bankIn2 = gActiveBattler;
}
if (gBattleMoves[gUnknown_02024250[gActiveBank]].type == TYPE_FIRE)
if (gBattleMoves[gLastLandedMoves[gActiveBattler]].type == TYPE_FIRE)
absorbingTypeAbility = ABILITY_FLASH_FIRE;
else if (gBattleMoves[gUnknown_02024250[gActiveBank]].type == TYPE_WATER)
else if (gBattleMoves[gLastLandedMoves[gActiveBattler]].type == TYPE_WATER)
absorbingTypeAbility = ABILITY_WATER_ABSORB;
else if (gBattleMoves[gUnknown_02024250[gActiveBank]].type == TYPE_ELECTRIC)
else if (gBattleMoves[gLastLandedMoves[gActiveBattler]].type == TYPE_ELECTRIC)
absorbingTypeAbility = ABILITY_VOLT_ABSORB;
else
return FALSE;
if (gBattleMons[gActiveBank].ability == absorbingTypeAbility)
if (gBattleMons[gActiveBattler].ability == absorbingTypeAbility)
return FALSE;
if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
{
if ((gActiveBank & BIT_MON) == 0)
if ((gActiveBattler & BIT_FLANK) == 0)
firstId = 0, lastId = 3;
else
firstId = 3, lastId = 6;
@@ -186,7 +172,7 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void)
firstId = 0, lastId = 6;
}
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
@@ -202,13 +188,13 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void)
continue;
if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG)
continue;
if (i == gBattlePartyID[bankIn1])
if (i == gBattlerPartyIndexes[bankIn1])
continue;
if (i == gBattlePartyID[bankIn2])
if (i == gBattlerPartyIndexes[bankIn2])
continue;
if (i == *(gBattleStruct->field_5C + bankIn1))
if (i == *(gBattleStruct->monToSwitchIntoId + bankIn1))
continue;
if (i == *(gBattleStruct->field_5C + bankIn2))
if (i == *(gBattleStruct->monToSwitchIntoId + bankIn2))
continue;
species = GetMonData(&party[i], MON_DATA_SPECIES);
@@ -220,8 +206,8 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void)
if (absorbingTypeAbility == monAbility && Random() & 1)
{
// we found a mon
*(gBattleStruct->field_294 + gActiveBank) = i;
EmitTwoReturnValues(1, ACTION_SWITCH, 0);
*(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = i;
BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
}
}
@@ -231,34 +217,34 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void)
static bool8 ShouldSwitchIfNaturalCure(void)
{
if (!(gBattleMons[gActiveBank].status1 & STATUS_SLEEP))
if (!(gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP))
return FALSE;
if (gBattleMons[gActiveBank].ability != ABILITY_NATURAL_CURE)
if (gBattleMons[gActiveBattler].ability != ABILITY_NATURAL_CURE)
return FALSE;
if (gBattleMons[gActiveBank].hp < gBattleMons[gActiveBank].maxHP / 2)
if (gBattleMons[gActiveBattler].hp < gBattleMons[gActiveBattler].maxHP / 2)
return FALSE;
if ((gUnknown_02024250[gActiveBank] == 0 || gUnknown_02024250[gActiveBank] == 0xFFFF) && Random() & 1)
if ((gLastLandedMoves[gActiveBattler] == 0 || gLastLandedMoves[gActiveBattler] == 0xFFFF) && Random() & 1)
{
*(gBattleStruct->field_294 + gActiveBank) = 6;
EmitTwoReturnValues(1, ACTION_SWITCH, 0);
*(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = 6;
BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
}
else if (gBattleMoves[gUnknown_02024250[gActiveBank]].power == 0 && Random() & 1)
else if (gBattleMoves[gLastLandedMoves[gActiveBattler]].power == 0 && Random() & 1)
{
*(gBattleStruct->field_294 + gActiveBank) = 6;
EmitTwoReturnValues(1, ACTION_SWITCH, 0);
*(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = 6;
BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
}
if (FindMonWithFlagsAndSuperEffective(MOVESTATUS_NOTAFFECTED, 1))
if (FindMonWithFlagsAndSuperEffective(MOVE_RESULT_DOESNT_AFFECT_FOE, 1))
return TRUE;
if (FindMonWithFlagsAndSuperEffective(MOVESTATUS_NOTVERYEFFECTIVE, 1))
if (FindMonWithFlagsAndSuperEffective(MOVE_RESULT_NOT_VERY_EFFECTIVE, 1))
return TRUE;
if (Random() & 1)
{
*(gBattleStruct->field_294 + gActiveBank) = 6;
EmitTwoReturnValues(1, ACTION_SWITCH, 0);
*(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = 6;
BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
}
@@ -267,25 +253,25 @@ static bool8 ShouldSwitchIfNaturalCure(void)
static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng)
{
u8 opposingIdentity;
u8 opposingPosition;
u8 opposingBank;
s32 i;
u8 moveFlags;
u16 move;
opposingIdentity = GetBankIdentity(gActiveBank) ^ BIT_SIDE;
opposingBank = GetBankByIdentity(opposingIdentity);
opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(gActiveBattler));
opposingBank = GetBattlerAtPosition(opposingPosition);
if (!(gAbsentBankFlags & gBitTable[opposingBank]))
if (!(gAbsentBattlerFlags & gBitTable[opposingBank]))
{
for (i = 0; i < 4; i++)
{
move = gBattleMons[gActiveBank].moves[i];
move = gBattleMons[gActiveBattler].moves[i];
if (move == MOVE_NONE)
continue;
moveFlags = AI_TypeCalc(move, gBattleMons[opposingBank].species, gBattleMons[opposingBank].ability);
if (moveFlags & MOVESTATUS_SUPEREFFECTIVE)
if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE)
{
if (noRng)
return TRUE;
@@ -297,18 +283,18 @@ static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng)
if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
return FALSE;
opposingBank = GetBankByIdentity(opposingIdentity ^ BIT_MON);
opposingBank = GetBattlerAtPosition(BATTLE_PARTNER(opposingPosition));
if (!(gAbsentBankFlags & gBitTable[opposingBank]))
if (!(gAbsentBattlerFlags & gBitTable[opposingBank]))
{
for (i = 0; i < 4; i++)
{
move = gBattleMons[gActiveBank].moves[i];
move = gBattleMons[gActiveBattler].moves[i];
if (move == MOVE_NONE)
continue;
moveFlags = AI_TypeCalc(move, gBattleMons[opposingBank].species, gBattleMons[opposingBank].ability);
if (moveFlags & MOVESTATUS_SUPEREFFECTIVE)
if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE)
{
if (noRng)
return TRUE;
@@ -328,8 +314,8 @@ static bool8 AreStatsRaised(void)
for (i = 0; i < BATTLE_STATS_NO; i++)
{
if (gBattleMons[gActiveBank].statStages[i] > 6)
buffedStatsValue += gBattleMons[gActiveBank].statStages[i] - 6;
if (gBattleMons[gActiveBattler].statStages[i] > 6)
buffedStatsValue += gBattleMons[gActiveBattler].statStages[i] - 6;
}
return (buffedStatsValue > 3);
@@ -345,32 +331,32 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent)
u16 move;
u8 moveFlags;
if (gUnknown_02024250[gActiveBank] == 0)
if (gLastLandedMoves[gActiveBattler] == 0)
return FALSE;
if (gUnknown_02024250[gActiveBank] == 0xFFFF)
if (gLastLandedMoves[gActiveBattler] == 0xFFFF)
return FALSE;
if (gUnknown_02024270[gActiveBank] == 0xFF)
if (gLastHitBy[gActiveBattler] == 0xFF)
return FALSE;
if (gBattleMoves[gUnknown_02024250[gActiveBank]].power == 0)
if (gBattleMoves[gLastLandedMoves[gActiveBattler]].power == 0)
return FALSE;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
bankIn1 = gActiveBank;
if (gAbsentBankFlags & gBitTable[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)])
bankIn2 = gActiveBank;
bankIn1 = gActiveBattler;
if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))])
bankIn2 = gActiveBattler;
else
bankIn2 = GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON);
bankIn2 = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)));
}
else
{
bankIn1 = gActiveBank;
bankIn2 = gActiveBank;
bankIn1 = gActiveBattler;
bankIn2 = gActiveBattler;
}
if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
{
if ((gActiveBank & BIT_MON) == 0)
if ((gActiveBattler & BIT_FLANK) == 0)
firstId = 0, lastId = 3;
else
firstId = 3, lastId = 6;
@@ -380,7 +366,7 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent)
firstId = 0, lastId = 6;
}
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
@@ -396,13 +382,13 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent)
continue;
if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG)
continue;
if (i == gBattlePartyID[bankIn1])
if (i == gBattlerPartyIndexes[bankIn1])
continue;
if (i == gBattlePartyID[bankIn2])
if (i == gBattlerPartyIndexes[bankIn2])
continue;
if (i == *(gBattleStruct->field_5C + bankIn1))
if (i == *(gBattleStruct->monToSwitchIntoId + bankIn1))
continue;
if (i == *(gBattleStruct->field_5C + bankIn2))
if (i == *(gBattleStruct->monToSwitchIntoId + bankIn2))
continue;
species = GetMonData(&party[i], MON_DATA_SPECIES);
@@ -411,10 +397,10 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent)
else
monAbility = gBaseStats[species].ability1;
moveFlags = AI_TypeCalc(gUnknown_02024250[gActiveBank], species, monAbility);
moveFlags = AI_TypeCalc(gLastLandedMoves[gActiveBattler], species, monAbility);
if (moveFlags & flags)
{
bankIn1 = gUnknown_02024270[gActiveBank];
bankIn1 = gLastHitBy[gActiveBattler];
for (j = 0; j < 4; j++)
{
@@ -423,10 +409,10 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent)
continue;
moveFlags = AI_TypeCalc(move, gBattleMons[bankIn1].species, gBattleMons[bankIn1].ability);
if (moveFlags & MOVESTATUS_SUPEREFFECTIVE && Random() % moduloPercent == 0)
if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && Random() % moduloPercent == 0)
{
*(gBattleStruct->field_294 + gActiveBank) = i;
EmitTwoReturnValues(1, ACTION_SWITCH, 0);
*(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = i;
BtlController_EmitTwoReturnValues(1, B_ACTION_SWITCH, 0);
return TRUE;
}
}
@@ -446,19 +432,19 @@ static bool8 ShouldSwitch(void)
s32 i;
s32 availableToSwitch;
if (gBattleMons[*(activeBankPtr = &gActiveBank)].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION))
if (gBattleMons[*(activeBankPtr = &gActiveBattler)].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION))
return FALSE;
if (gStatuses3[gActiveBank] & STATUS3_ROOTED)
if (gStatuses3[gActiveBattler] & STATUS3_ROOTED)
return FALSE;
if (AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gActiveBank, ABILITY_SHADOW_TAG, 0, 0))
if (AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gActiveBattler, ABILITY_SHADOW_TAG, 0, 0))
return FALSE;
if (AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gActiveBank, ABILITY_ARENA_TRAP, 0, 0))
if (AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gActiveBattler, ABILITY_ARENA_TRAP, 0, 0))
return FALSE; // misses the flying or levitate check
if (AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_MAGNET_PULL, 0, 0))
{
if (gBattleMons[gActiveBank].type1 == TYPE_STEEL)
if (gBattleMons[gActiveBattler].type1 == TYPE_STEEL)
return FALSE;
if (gBattleMons[gActiveBank].type2 == TYPE_STEEL)
if (gBattleMons[gActiveBattler].type2 == TYPE_STEEL)
return FALSE;
}
if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
@@ -468,10 +454,10 @@ static bool8 ShouldSwitch(void)
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
bankIn1 = *activeBankPtr;
if (gAbsentBankFlags & gBitTable[GetBankByIdentity(GetBankIdentity(*activeBankPtr) ^ BIT_MON)])
if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(GetBattlerPosition(*activeBankPtr) ^ BIT_FLANK)])
bankIn2 = *activeBankPtr;
else
bankIn2 = GetBankByIdentity(GetBankIdentity(*activeBankPtr) ^ BIT_MON);
bankIn2 = GetBattlerAtPosition(GetBattlerPosition(*activeBankPtr) ^ BIT_FLANK);
}
else
{
@@ -481,7 +467,7 @@ static bool8 ShouldSwitch(void)
if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
{
if ((gActiveBank & BIT_MON) == 0)
if ((gActiveBattler & BIT_FLANK) == 0)
firstId = 0, lastId = 3;
else
firstId = 3, lastId = 6;
@@ -491,7 +477,7 @@ static bool8 ShouldSwitch(void)
firstId = 0, lastId = 6;
}
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
@@ -504,13 +490,13 @@ static bool8 ShouldSwitch(void)
continue;
if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG)
continue;
if (i == gBattlePartyID[bankIn1])
if (i == gBattlerPartyIndexes[bankIn1])
continue;
if (i == gBattlePartyID[bankIn2])
if (i == gBattlerPartyIndexes[bankIn2])
continue;
if (i == *(gBattleStruct->field_5C + bankIn1))
if (i == *(gBattleStruct->monToSwitchIntoId + bankIn1))
continue;
if (i == *(gBattleStruct->field_5C + bankIn2))
if (i == *(gBattleStruct->monToSwitchIntoId + bankIn2))
continue;
availableToSwitch++;
@@ -530,8 +516,8 @@ static bool8 ShouldSwitch(void)
return FALSE;
if (AreStatsRaised())
return FALSE;
if (FindMonWithFlagsAndSuperEffective(MOVESTATUS_NOTAFFECTED, 2)
|| FindMonWithFlagsAndSuperEffective(MOVESTATUS_NOTVERYEFFECTIVE, 3))
if (FindMonWithFlagsAndSuperEffective(MOVE_RESULT_DOESNT_AFFECT_FOE, 2)
|| FindMonWithFlagsAndSuperEffective(MOVE_RESULT_NOT_VERY_EFFECTIVE, 3))
return TRUE;
return FALSE;
@@ -543,9 +529,9 @@ void AI_TrySwitchOrUseItem(void)
u8 bankIn1, bankIn2;
s32 firstId;
s32 lastId; // + 1
u8 bankIdentity = GetBankIdentity(gActiveBank);
u8 bankIdentity = GetBattlerPosition(gActiveBattler);
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
@@ -554,25 +540,25 @@ void AI_TrySwitchOrUseItem(void)
{
if (ShouldSwitch())
{
if (*(gBattleStruct->field_294 + gActiveBank) == 6)
if (*(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) == 6)
{
s32 monToSwitchId = GetMostSuitableMonToSwitchInto();
if (monToSwitchId == 6)
{
if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
{
bankIn1 = GetBankByIdentity(bankIdentity);
bankIn1 = GetBattlerAtPosition(bankIdentity);
bankIn2 = bankIn1;
}
else
{
bankIn1 = GetBankByIdentity(bankIdentity);
bankIn2 = GetBankByIdentity(bankIdentity ^ BIT_MON);
bankIn1 = GetBattlerAtPosition(bankIdentity);
bankIn2 = GetBattlerAtPosition(bankIdentity ^ BIT_FLANK);
}
if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
{
if ((gActiveBank & BIT_MON) == 0)
if ((gActiveBattler & BIT_FLANK) == 0)
firstId = 0, lastId = 3;
else
firstId = 3, lastId = 6;
@@ -586,23 +572,23 @@ void AI_TrySwitchOrUseItem(void)
{
if (GetMonData(&party[monToSwitchId], MON_DATA_HP) == 0)
continue;
if (monToSwitchId == gBattlePartyID[bankIn1])
if (monToSwitchId == gBattlerPartyIndexes[bankIn1])
continue;
if (monToSwitchId == gBattlePartyID[bankIn2])
if (monToSwitchId == gBattlerPartyIndexes[bankIn2])
continue;
if (monToSwitchId == *(gBattleStruct->field_5C + bankIn1))
if (monToSwitchId == *(gBattleStruct->monToSwitchIntoId + bankIn1))
continue;
if (monToSwitchId == *(gBattleStruct->field_5C + bankIn2))
if (monToSwitchId == *(gBattleStruct->monToSwitchIntoId + bankIn2))
continue;
break;
}
}
*(gBattleStruct->field_294 + gActiveBank) = monToSwitchId;
*(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = monToSwitchId;
}
*(gBattleStruct->field_5C + gActiveBank) = *(gBattleStruct->field_294 + gActiveBank);
*(gBattleStruct->monToSwitchIntoId + gActiveBattler) = *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler);
return;
}
else if (ShouldUseItem())
@@ -611,31 +597,28 @@ void AI_TrySwitchOrUseItem(void)
}
}
EmitTwoReturnValues(1, ACTION_USE_MOVE, (gActiveBank ^ BIT_SIDE) << 8);
BtlController_EmitTwoReturnValues(1, B_ACTION_USE_MOVE, (gActiveBattler ^ BIT_SIDE) << 8);
}
#define TYPE_FORESIGHT 0xFE
#define TYPE_ENDTABLE 0xFF
static void ModulateByTypeEffectiveness(u8 atkType, u8 defType1, u8 defType2, u8 *var)
{
s32 i = 0;
while (gTypeEffectiveness[i] != TYPE_ENDTABLE)
while (TYPE_EFFECT_ATK_TYPE(i) != TYPE_ENDTABLE)
{
if (gTypeEffectiveness[i] == TYPE_FORESIGHT)
if (TYPE_EFFECT_ATK_TYPE(i) == TYPE_FORESIGHT)
{
i += 3;
continue;
}
else if (gTypeEffectiveness[i] == atkType)
else if (TYPE_EFFECT_ATK_TYPE(i) == atkType)
{
// check type1
if (gTypeEffectiveness[i + 1] == defType1)
*var = (*var * gTypeEffectiveness[i + 2]) / 10;
if (TYPE_EFFECT_DEF_TYPE(i) == defType1)
*var = (*var * TYPE_EFFECT_MULTIPLIER(i)) / 10;
// check type2
if (gTypeEffectiveness[i + 1] == defType2 && defType1 != defType2)
*var = (*var * gTypeEffectiveness[i + 2]) / 10;
if (TYPE_EFFECT_DEF_TYPE(i) == defType2 && defType1 != defType2)
*var = (*var * TYPE_EFFECT_MULTIPLIER(i)) / 10;
}
i += 3;
}
@@ -654,34 +637,34 @@ u8 GetMostSuitableMonToSwitchInto(void)
u8 invalidMons;
u16 move;
if (*(gBattleStruct->field_5C + gActiveBank) != 6)
return *(gBattleStruct->field_5C + gActiveBank);
if (*(gBattleStruct->monToSwitchIntoId + gActiveBattler) != 6)
return *(gBattleStruct->monToSwitchIntoId + gActiveBattler);
if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
return gBattlePartyID[gActiveBank] + 1;
return gBattlerPartyIndexes[gActiveBattler] + 1;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
bankIn1 = gActiveBank;
if (gAbsentBankFlags & gBitTable[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)])
bankIn2 = gActiveBank;
bankIn1 = gActiveBattler;
if (gAbsentBattlerFlags & gBitTable[GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK)])
bankIn2 = gActiveBattler;
else
bankIn2 = GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON);
bankIn2 = GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_FLANK);
// UB: It considers the opponent only player's side even though it can battle alongside player;
opposingBank = Random() & BIT_MON;
if (gAbsentBankFlags & gBitTable[opposingBank])
opposingBank ^= BIT_MON;
opposingBank = Random() & BIT_FLANK;
if (gAbsentBattlerFlags & gBitTable[opposingBank])
opposingBank ^= BIT_FLANK;
}
else
{
opposingBank = GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_SIDE);
bankIn1 = gActiveBank;
bankIn2 = gActiveBank;
opposingBank = GetBattlerAtPosition(GetBattlerPosition(gActiveBattler) ^ BIT_SIDE);
bankIn1 = gActiveBattler;
bankIn2 = gActiveBattler;
}
if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
{
if ((gActiveBank & BIT_MON) == 0)
if ((gActiveBattler & BIT_FLANK) == 0)
firstId = 0, lastId = 3;
else
firstId = 3, lastId = 6;
@@ -691,7 +674,7 @@ u8 GetMostSuitableMonToSwitchInto(void)
firstId = 0, lastId = 6;
}
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
@@ -709,10 +692,10 @@ u8 GetMostSuitableMonToSwitchInto(void)
if (species != SPECIES_NONE
&& GetMonData(&party[i], MON_DATA_HP) != 0
&& !(gBitTable[i] & invalidMons)
&& gBattlePartyID[bankIn1] != i
&& gBattlePartyID[bankIn2] != i
&& i != *(gBattleStruct->field_5C + bankIn1)
&& i != *(gBattleStruct->field_5C + bankIn2))
&& gBattlerPartyIndexes[bankIn1] != i
&& gBattlerPartyIndexes[bankIn2] != i
&& i != *(gBattleStruct->monToSwitchIntoId + bankIn1)
&& i != *(gBattleStruct->monToSwitchIntoId + bankIn2))
{
u8 type1 = gBaseStats[species].type1;
u8 type2 = gBaseStats[species].type2;
@@ -737,7 +720,7 @@ u8 GetMostSuitableMonToSwitchInto(void)
for (i = 0; i < 4; i++)
{
move = GetMonData(&party[bestMonId], MON_DATA_MOVE1 + i);
if (move != MOVE_NONE && TypeCalc(move, gActiveBank, opposingBank) & MOVESTATUS_SUPEREFFECTIVE)
if (move != MOVE_NONE && TypeCalc(move, gActiveBattler, opposingBank) & MOVE_RESULT_SUPER_EFFECTIVE)
break;
}
@@ -755,7 +738,7 @@ u8 GetMostSuitableMonToSwitchInto(void)
gDynamicBasePower = 0;
gBattleStruct->dynamicMoveType = 0;
gBattleScripting.dmgMultiplier = 1;
gBattleMoveFlags = 0;
gMoveResultFlags = 0;
gCritMultiplier = 1;
bestDmg = 0;
bestMonId = 6;
@@ -767,13 +750,13 @@ u8 GetMostSuitableMonToSwitchInto(void)
continue;
if (GetMonData(&party[i], MON_DATA_HP) == 0)
continue;
if (gBattlePartyID[bankIn1] == i)
if (gBattlerPartyIndexes[bankIn1] == i)
continue;
if (gBattlePartyID[bankIn2] == i)
if (gBattlerPartyIndexes[bankIn2] == i)
continue;
if (i == *(gBattleStruct->field_5C + bankIn1))
if (i == *(gBattleStruct->monToSwitchIntoId + bankIn1))
continue;
if (i == *(gBattleStruct->field_5C + bankIn2))
if (i == *(gBattleStruct->monToSwitchIntoId + bankIn2))
continue;
for (j = 0; j < 4; j++)
@@ -782,8 +765,8 @@ u8 GetMostSuitableMonToSwitchInto(void)
gBattleMoveDamage = 0;
if (move != MOVE_NONE && gBattleMoves[move].power != 1)
{
AI_CalcDmg(gActiveBank, opposingBank);
TypeCalc(move, gActiveBank, opposingBank);
AI_CalcDmg(gActiveBattler, opposingBank);
TypeCalc(move, gActiveBattler, opposingBank);
}
if (bestDmg < gBattleMoveDamage)
{
@@ -820,10 +803,10 @@ static bool8 ShouldUseItem(void)
u8 validMons = 0;
bool8 shouldUse = FALSE;
if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && GetBankIdentity(gActiveBank) == IDENTITY_PLAYER_MON2)
if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT)
return FALSE;
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
@@ -858,14 +841,14 @@ static bool8 ShouldUseItem(void)
else
itemEffects = gItemEffectTable[item - 13];
*(gBattleStruct->AI_itemType + gActiveBank / 2) = GetAI_ItemType(item, itemEffects);
*(gBattleStruct->AI_itemType + gActiveBattler / 2) = GetAI_ItemType(item, itemEffects);
switch (*(gBattleStruct->AI_itemType + gActiveBank / 2))
switch (*(gBattleStruct->AI_itemType + gActiveBattler / 2))
{
case AI_ITEM_FULL_RESTORE:
if (gBattleMons[gActiveBank].hp >= gBattleMons[gActiveBank].maxHP / 4)
if (gBattleMons[gActiveBattler].hp >= gBattleMons[gActiveBattler].maxHP / 4)
break;
if (gBattleMons[gActiveBank].hp == 0)
if (gBattleMons[gActiveBattler].hp == 0)
break;
shouldUse = TRUE;
break;
@@ -873,65 +856,65 @@ static bool8 ShouldUseItem(void)
paramOffset = GetItemEffectParamOffset(item, 4, 4);
if (paramOffset == 0)
break;
if (gBattleMons[gActiveBank].hp == 0)
if (gBattleMons[gActiveBattler].hp == 0)
break;
if (gBattleMons[gActiveBank].hp < gBattleMons[gActiveBank].maxHP / 4 || gBattleMons[gActiveBank].maxHP - gBattleMons[gActiveBank].hp > itemEffects[paramOffset])
if (gBattleMons[gActiveBattler].hp < gBattleMons[gActiveBattler].maxHP / 4 || gBattleMons[gActiveBattler].maxHP - gBattleMons[gActiveBattler].hp > itemEffects[paramOffset])
shouldUse = TRUE;
break;
case AI_ITEM_CURE_CONDITION:
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) = 0;
if (itemEffects[3] & 0x20 && gBattleMons[gActiveBank].status1 & STATUS_SLEEP)
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) = 0;
if (itemEffects[3] & 0x20 && gBattleMons[gActiveBattler].status1 & STATUS1_SLEEP)
{
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x20;
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x20;
shouldUse = TRUE;
}
if (itemEffects[3] & 0x10 && (gBattleMons[gActiveBank].status1 & STATUS_POISON || gBattleMons[gActiveBank].status1 & STATUS_TOXIC_POISON))
if (itemEffects[3] & 0x10 && (gBattleMons[gActiveBattler].status1 & STATUS1_POISON || gBattleMons[gActiveBattler].status1 & STATUS1_TOXIC_POISON))
{
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x10;
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x10;
shouldUse = TRUE;
}
if (itemEffects[3] & 0x8 && gBattleMons[gActiveBank].status1 & STATUS_BURN)
if (itemEffects[3] & 0x8 && gBattleMons[gActiveBattler].status1 & STATUS1_BURN)
{
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x8;
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x8;
shouldUse = TRUE;
}
if (itemEffects[3] & 0x4 && gBattleMons[gActiveBank].status1 & STATUS_FREEZE)
if (itemEffects[3] & 0x4 && gBattleMons[gActiveBattler].status1 & STATUS1_FREEZE)
{
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x4;
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x4;
shouldUse = TRUE;
}
if (itemEffects[3] & 0x2 && gBattleMons[gActiveBank].status1 & STATUS_PARALYSIS)
if (itemEffects[3] & 0x2 && gBattleMons[gActiveBattler].status1 & STATUS1_PARALYSIS)
{
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x2;
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x2;
shouldUse = TRUE;
}
if (itemEffects[3] & 0x1 && gBattleMons[gActiveBank].status2 & STATUS2_CONFUSION)
if (itemEffects[3] & 0x1 && gBattleMons[gActiveBattler].status2 & STATUS2_CONFUSION)
{
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x1;
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x1;
shouldUse = TRUE;
}
break;
case AI_ITEM_X_STAT:
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) = 0;
if (gDisableStructs[gActiveBank].isFirstTurn == 0)
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) = 0;
if (gDisableStructs[gActiveBattler].isFirstTurn == 0)
break;
if (itemEffects[0] & 0xF)
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x1;
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x1;
if (itemEffects[1] & 0xF0)
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x2;
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x2;
if (itemEffects[1] & 0xF)
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x4;
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x4;
if (itemEffects[2] & 0xF)
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x8;
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x8;
if (itemEffects[2] & 0xF0)
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x20;
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x20;
if (itemEffects[0] & 0x30)
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x80;
*(gBattleStruct->AI_itemFlags + gActiveBattler / 2) |= 0x80;
shouldUse = TRUE;
break;
case AI_ITEM_GUARD_SPECS:
bankSide = GetBankSide(gActiveBank);
if (gDisableStructs[gActiveBank].isFirstTurn != 0 && gSideTimers[bankSide].mistTimer == 0)
bankSide = GetBattlerSide(gActiveBattler);
if (gDisableStructs[gActiveBattler].isFirstTurn != 0 && gSideTimers[bankSide].mistTimer == 0)
shouldUse = TRUE;
break;
case AI_ITEM_NOT_RECOGNIZABLE:
@@ -940,8 +923,8 @@ static bool8 ShouldUseItem(void)
if (shouldUse)
{
EmitTwoReturnValues(1, ACTION_USE_ITEM, 0);
*(gBattleStruct->chosenItem + (gActiveBank / 2) * 2) = item;
BtlController_EmitTwoReturnValues(1, B_ACTION_USE_ITEM, 0);
*(gBattleStruct->chosenItem + (gActiveBattler / 2) * 2) = item;
gBattleResources->battleHistory->trainerItems[i] = 0;
return shouldUse;
}
+125 -129
View File
@@ -1,6 +1,7 @@
#include "global.h"
#include "battle.h"
#include "battle_anim.h"
#include "constants/battle_anim.h"
#include "sprite.h"
#include "contest.h"
#include "m4a.h"
@@ -24,8 +25,6 @@
#define ANIM_SPRITE_INDEX_COUNT 8
extern u8 gBankAttacker;
extern u8 gBankTarget;
extern u16 gBattle_WIN0H;
extern u16 gBattle_WIN0V;
extern u16 gBattle_WIN1H;
@@ -34,12 +33,9 @@ extern u16 gBattle_BG1_X;
extern u16 gBattle_BG1_Y;
extern u16 gBattle_BG2_X;
extern u16 gBattle_BG2_Y;
extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
extern u8 gBankSpriteIds[BATTLE_BANKS_COUNT];
extern struct MusicPlayerInfo gMPlay_BGM;
extern struct MusicPlayerInfo gMPlay_SE1;
extern struct MusicPlayerInfo gMPlay_SE2;
extern u8 gDecompressionBuffer[];
extern struct MusicPlayerInfo gMPlayInfo_BGM;
extern struct MusicPlayerInfo gMPlayInfo_SE1;
extern struct MusicPlayerInfo gMPlayInfo_SE2;
extern const u16 gUnknown_082C8D64[];
extern const u8 * const gBattleAnims_Moves[];
@@ -67,7 +63,7 @@ static void ScriptCmd_return(void);
static void ScriptCmd_setarg(void);
static void ScriptCmd_choosetwoturnanim(void);
static void ScriptCmd_jumpifmoveturn(void);
static void ScriptCmd_jump(void);
static void ScriptCmd_goto(void);
static void ScriptCmd_fadetobg(void);
static void ScriptCmd_restorebg(void);
static void ScriptCmd_waitbgfadeout(void);
@@ -129,9 +125,9 @@ EWRAM_DATA static u8 sMonAnimTaskIdArray[2] = {0};
EWRAM_DATA u8 gAnimMoveTurn = 0;
EWRAM_DATA static u8 sAnimBackgroundFadeState = 0;
EWRAM_DATA static u16 sAnimMoveIndex = 0; // set but unused.
EWRAM_DATA u8 gAnimBankAttacker = 0;
EWRAM_DATA u8 gAnimBankTarget = 0;
EWRAM_DATA u16 gAnimSpeciesByBanks[BATTLE_BANKS_COUNT] = {0};
EWRAM_DATA u8 gBattleAnimAttacker = 0;
EWRAM_DATA u8 gBattleAnimTarget = 0;
EWRAM_DATA u16 gAnimSpeciesByBanks[MAX_BATTLERS_COUNT] = {0};
EWRAM_DATA u8 gUnknown_02038440 = 0;
// const rom data
@@ -156,7 +152,7 @@ static void (* const sScriptCmdTable[])(void) =
ScriptCmd_setarg,
ScriptCmd_choosetwoturnanim,
ScriptCmd_jumpifmoveturn,
ScriptCmd_jump,
ScriptCmd_goto,
ScriptCmd_fadetobg,
ScriptCmd_restorebg,
ScriptCmd_waitbgfadeout,
@@ -213,15 +209,15 @@ void ClearBattleAnimationVars(void)
gAnimMoveTurn = 0;
sAnimBackgroundFadeState = 0;
sAnimMoveIndex = 0;
gAnimBankAttacker = 0;
gAnimBankTarget = 0;
gBattleAnimAttacker = 0;
gBattleAnimTarget = 0;
gUnknown_02038440 = 0;
}
void DoMoveAnim(u16 move)
{
gAnimBankAttacker = gBankAttacker;
gAnimBankTarget = gBankTarget;
gBattleAnimAttacker = gBattlerAttacker;
gBattleAnimTarget = gBattlerTarget;
LaunchBattleAnimation(gBattleAnims_Moves, move, TRUE);
}
@@ -233,12 +229,12 @@ void LaunchBattleAnimation(const u8 *const animsTable[], u16 tableId, bool8 isMo
{
sub_80A8278();
UpdateOamPriorityInAllHealthboxes(0);
for (i = 0; i < BATTLE_BANKS_COUNT; i++)
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
if (GetBankSide(i) != 0)
gAnimSpeciesByBanks[i] = GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_SPECIES);
if (GetBattlerSide(i) != 0)
gAnimSpeciesByBanks[i] = GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES);
else
gAnimSpeciesByBanks[i] = GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_SPECIES);
gAnimSpeciesByBanks[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES);
}
}
else
@@ -271,7 +267,7 @@ void LaunchBattleAnimation(const u8 *const animsTable[], u16 tableId, bool8 isMo
{
if (tableId == gUnknown_082C8D64[i])
{
m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 128);
m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 128);
break;
}
}
@@ -408,7 +404,7 @@ static void ScriptCmd_createsprite(void)
else
argVar *= -1;
subpriority = sub_80A82E4(gAnimBankTarget) + (s8)(argVar);
subpriority = sub_80A82E4(gBattleAnimTarget) + (s8)(argVar);
}
else
{
@@ -417,13 +413,13 @@ static void ScriptCmd_createsprite(void)
else
argVar *= -1;
subpriority = sub_80A82E4(gAnimBankAttacker) + (s8)(argVar);
subpriority = sub_80A82E4(gBattleAnimAttacker) + (s8)(argVar);
}
if (subpriority < 3)
subpriority = 3;
CreateSpriteAndAnimate(template, sub_80A5C6C(gAnimBankTarget, 2), sub_80A5C6C(gAnimBankTarget, 3), subpriority);
CreateSpriteAndAnimate(template, GetBattlerSpriteCoord(gBattleAnimTarget, 2), GetBattlerSpriteCoord(gBattleAnimTarget, 3), subpriority);
gAnimVisualTaskCount++;
}
@@ -513,8 +509,8 @@ static void ScriptCmd_end(void)
}
else
{
m4aMPlayStop(&gMPlay_SE1);
m4aMPlayStop(&gMPlay_SE2);
m4aMPlayStop(&gMPlayInfo_SE1);
m4aMPlayStop(&gMPlayInfo_SE2);
}
}
@@ -533,7 +529,7 @@ static void ScriptCmd_end(void)
if (!continuousAnim) // may have been used for debug?
{
m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 256);
m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 256);
if (!IsContest())
{
sub_80A8278();
@@ -564,7 +560,7 @@ static void sub_80A40F4(u8 taskId)
u8 newTaskId;
s16 *selfData = gTasks[taskId].data;
u8 bankSpriteId = gBankSpriteIds[selfData[t1_MONBG_BANK]];
u8 bankSpriteId = gBattlerSpriteIds[selfData[t1_MONBG_BANK]];
gSprites[bankSpriteId].invisible = 1;
if (!selfData[t1_CREATE_ANOTHER_TASK])
@@ -605,15 +601,15 @@ static void ScriptCmd_monbg(void)
sBattleAnimScriptPtr++;
animBank = sBattleAnimScriptPtr[0];
if (animBank & ANIM_BANK_TARGET)
bank = gAnimBankTarget;
if (animBank & ANIM_TARGET)
bank = gBattleAnimTarget;
else
bank = gAnimBankAttacker;
bank = gBattleAnimAttacker;
if (IsAnimBankSpriteVisible(bank))
if (IsBattlerSpriteVisible(bank))
{
u8 identity = GetBankIdentity(bank);
if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest())
u8 position = GetBattlerPosition(bank);
if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest())
toBG_2 = FALSE;
else
toBG_2 = TRUE;
@@ -628,11 +624,11 @@ static void ScriptCmd_monbg(void)
}
bank ^= BIT_MON;
if (IsAnimBankSpriteVisible(bank))
bank ^= BIT_FLANK;
if (IsBattlerSpriteVisible(bank))
{
u8 identity = GetBankIdentity(bank);
if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest())
u8 position = GetBattlerPosition(bank);
if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest())
toBG_2 = FALSE;
else
toBG_2 = TRUE;
@@ -651,20 +647,20 @@ static void ScriptCmd_monbg(void)
gAnimScriptCallback = WaitAnimFrameCount;
}
bool8 IsAnimBankSpriteVisible(u8 bank)
bool8 IsBattlerSpriteVisible(u8 bank)
{
if (IsContest())
{
if (bank == gAnimBankAttacker)
if (bank == gBattleAnimAttacker)
return TRUE;
else
return FALSE;
}
if (!IsBankSpritePresent(bank))
if (!IsBattlerSpritePresent(bank))
return FALSE;
if (IsContest())
return TRUE; // this line wont ever be reached.
if (!gBattleSpritesDataPtr->bankData[bank].invisible || !gSprites[gBankSpriteIds[bank]].invisible)
if (!gBattleSpritesDataPtr->battlerData[bank].invisible || !gSprites[gBattlerSpriteIds[bank]].invisible)
return TRUE;
return FALSE;
@@ -698,7 +694,7 @@ void sub_80A438C(u8 bank, bool8 toBG_2, bool8 setSpriteInvisible)
SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 1);
SetAnimBgAttribute(1, BG_ANIM_AREA_OVERFLOW_MODE, 0);
bankSpriteId = gBankSpriteIds[bank];
bankSpriteId = gBattlerSpriteIds[bank];
gBattle_BG1_X = -(gSprites[bankSpriteId].pos1.x + gSprites[bankSpriteId].pos2.x) + 0x20;
if (IsContest() && IsSpeciesNotUnown(gContestResources->field_18->field_0))
@@ -706,7 +702,7 @@ void sub_80A438C(u8 bank, bool8 toBG_2, bool8 setSpriteInvisible)
gBattle_BG1_Y = -(gSprites[bankSpriteId].pos1.y + gSprites[bankSpriteId].pos2.y) + 0x20;
if (setSpriteInvisible)
gSprites[gBankSpriteIds[bank]].invisible = 1;
gSprites[gBattlerSpriteIds[bank]].invisible = 1;
SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X);
SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y);
@@ -717,7 +713,7 @@ void sub_80A438C(u8 bank, bool8 toBG_2, bool8 setSpriteInvisible)
if (IsContest())
bankIdentity = 0;
else
bankIdentity = GetBankIdentity(bank);
bankIdentity = GetBattlerPosition(bank);
sub_8118FBC(1, 0, 0, bankIdentity, unknownStruct.unk8, unknownStruct.unk0, unknownStruct.unk4, unknownStruct.unkA);
@@ -735,13 +731,13 @@ void sub_80A438C(u8 bank, bool8 toBG_2, bool8 setSpriteInvisible)
SetAnimBgAttribute(2, BG_ANIM_SCREEN_SIZE, 1);
SetAnimBgAttribute(2, BG_ANIM_AREA_OVERFLOW_MODE, 0);
bankSpriteId = gBankSpriteIds[bank];
bankSpriteId = gBattlerSpriteIds[bank];
gBattle_BG2_X = -(gSprites[bankSpriteId].pos1.x + gSprites[bankSpriteId].pos2.x) + 0x20;
gBattle_BG2_Y = -(gSprites[bankSpriteId].pos1.y + gSprites[bankSpriteId].pos2.y) + 0x20;
if (setSpriteInvisible)
gSprites[gBankSpriteIds[bank]].invisible = 1;
gSprites[gBattlerSpriteIds[bank]].invisible = 1;
SetGpuReg(REG_OFFSET_BG2HOFS, gBattle_BG2_X);
SetGpuReg(REG_OFFSET_BG2VOFS, gBattle_BG2_Y);
@@ -749,7 +745,7 @@ void sub_80A438C(u8 bank, bool8 toBG_2, bool8 setSpriteInvisible)
LoadPalette(&gPlttBufferUnfaded[0x100 + bank * 16], 0x90, 0x20);
CpuCopy32(&gPlttBufferUnfaded[0x100 + bank * 16], (void*)(BG_PLTT + 0x120), 0x20);
sub_8118FBC(2, 0, 0, GetBankIdentity(bank), unknownStruct.unk8, unknownStruct.unk0 + 0x1000, unknownStruct.unk4 + 0x400, unknownStruct.unkA);
sub_8118FBC(2, 0, 0, GetBattlerPosition(bank), unknownStruct.unk8, unknownStruct.unk0 + 0x1000, unknownStruct.unk4 + 0x400, unknownStruct.unkA);
}
}
@@ -862,20 +858,20 @@ static void ScriptCmd_clearmonbg(void)
sBattleAnimScriptPtr++;
animBankId = sBattleAnimScriptPtr[0];
if (animBankId == ANIM_BANK_ATTACKER)
animBankId = ANIM_BANK_ATK_PARTNER;
else if (animBankId == ANIM_BANK_TARGET)
animBankId = ANIM_BANK_DEF_PARTNER;
if (animBankId == ANIM_ATTACKER)
animBankId = ANIM_ATK_PARTNER;
else if (animBankId == ANIM_TARGET)
animBankId = ANIM_DEF_PARTNER;
if (animBankId == ANIM_BANK_ATTACKER || animBankId == ANIM_BANK_ATK_PARTNER)
bank = gAnimBankAttacker;
if (animBankId == ANIM_ATTACKER || animBankId == ANIM_ATK_PARTNER)
bank = gBattleAnimAttacker;
else
bank = gAnimBankTarget;
bank = gBattleAnimTarget;
if (sMonAnimTaskIdArray[0] != 0xFF)
gSprites[gBankSpriteIds[bank]].invisible = 0;
gSprites[gBattlerSpriteIds[bank]].invisible = 0;
if (animBankId > 1 && sMonAnimTaskIdArray[1] != 0xFF)
gSprites[gBankSpriteIds[bank ^ BIT_MON]].invisible = 0;
gSprites[gBattlerSpriteIds[bank ^ BIT_FLANK]].invisible = 0;
else
animBankId = 0;
@@ -892,8 +888,8 @@ static void sub_80A4980(u8 taskId)
if (gTasks[taskId].data[1] != 1)
{
u8 to_BG2;
u8 identity = GetBankIdentity(gTasks[taskId].data[2]);
if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest())
u8 position = GetBattlerPosition(gTasks[taskId].data[2]);
if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest())
to_BG2 = FALSE;
else
to_BG2 = TRUE;
@@ -924,20 +920,20 @@ static void ScriptCmd_monbg_22(void)
animBankId = sBattleAnimScriptPtr[0];
if (animBankId == ANIM_BANK_ATTACKER)
animBankId = ANIM_BANK_ATK_PARTNER;
else if (animBankId == ANIM_BANK_TARGET)
animBankId = ANIM_BANK_DEF_PARTNER;
if (animBankId == ANIM_ATTACKER)
animBankId = ANIM_ATK_PARTNER;
else if (animBankId == ANIM_TARGET)
animBankId = ANIM_DEF_PARTNER;
if (animBankId == ANIM_BANK_ATTACKER || animBankId == ANIM_BANK_ATK_PARTNER)
bank = gAnimBankAttacker;
if (animBankId == ANIM_ATTACKER || animBankId == ANIM_ATK_PARTNER)
bank = gBattleAnimAttacker;
else
bank = gAnimBankTarget;
bank = gBattleAnimTarget;
if (IsAnimBankSpriteVisible(bank))
if (IsBattlerSpriteVisible(bank))
{
u8 identity = GetBankIdentity(bank);
if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest())
u8 position = GetBattlerPosition(bank);
if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest())
toBG_2 = FALSE;
else
toBG_2 = TRUE;
@@ -945,11 +941,11 @@ static void ScriptCmd_monbg_22(void)
sub_80A438C(bank, toBG_2, FALSE);
}
bank ^= BIT_MON;
if (animBankId > 1 && IsAnimBankSpriteVisible(bank))
bank ^= BIT_FLANK;
if (animBankId > 1 && IsBattlerSpriteVisible(bank))
{
u8 identity = GetBankIdentity(bank);
if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest())
u8 position = GetBattlerPosition(bank);
if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest())
toBG_2 = FALSE;
else
toBG_2 = TRUE;
@@ -969,20 +965,20 @@ static void ScriptCmd_clearmonbg_23(void)
sBattleAnimScriptPtr++;
animBankId = sBattleAnimScriptPtr[0];
if (animBankId == ANIM_BANK_ATTACKER)
animBankId = ANIM_BANK_ATK_PARTNER;
else if (animBankId == ANIM_BANK_TARGET)
animBankId = ANIM_BANK_DEF_PARTNER;
if (animBankId == ANIM_ATTACKER)
animBankId = ANIM_ATK_PARTNER;
else if (animBankId == ANIM_TARGET)
animBankId = ANIM_DEF_PARTNER;
if (animBankId == ANIM_BANK_ATTACKER || animBankId == ANIM_BANK_ATK_PARTNER)
bank = gAnimBankAttacker;
if (animBankId == ANIM_ATTACKER || animBankId == ANIM_ATK_PARTNER)
bank = gBattleAnimAttacker;
else
bank = gAnimBankTarget;
bank = gBattleAnimTarget;
if (IsAnimBankSpriteVisible(bank))
gSprites[gBankSpriteIds[bank]].invisible = 0;
if (animBankId > 1 && IsAnimBankSpriteVisible(bank ^ BIT_MON))
gSprites[gBankSpriteIds[bank ^ BIT_MON]].invisible = 0;
if (IsBattlerSpriteVisible(bank))
gSprites[gBattlerSpriteIds[bank]].invisible = 0;
if (animBankId > 1 && IsBattlerSpriteVisible(bank ^ BIT_FLANK))
gSprites[gBattlerSpriteIds[bank ^ BIT_FLANK]].invisible = 0;
else
animBankId = 0;
@@ -1000,15 +996,15 @@ static void sub_80A4BB0(u8 taskId)
{
bool8 toBG_2;
u8 bank = gTasks[taskId].data[2];
u8 identity = GetBankIdentity(bank);
if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest())
u8 position = GetBattlerPosition(bank);
if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest())
toBG_2 = FALSE;
else
toBG_2 = TRUE;
if (IsAnimBankSpriteVisible(bank))
if (IsBattlerSpriteVisible(bank))
sub_80A477C(toBG_2);
if (gTasks[taskId].data[0] > 1 && IsAnimBankSpriteVisible(bank ^ BIT_MON))
if (gTasks[taskId].data[0] > 1 && IsBattlerSpriteVisible(bank ^ BIT_FLANK))
sub_80A477C(toBG_2 ^ 1);
DestroyTask(taskId);
@@ -1099,7 +1095,7 @@ static void ScriptCmd_jumpifmoveturn(void)
sBattleAnimScriptPtr += 4;
}
static void ScriptCmd_jump(void)
static void ScriptCmd_goto(void)
{
sBattleAnimScriptPtr++;
sBattleAnimScriptPtr = SCRIPT_READ_PTR(sBattleAnimScriptPtr);
@@ -1144,7 +1140,7 @@ static void ScriptCmd_fadetobgfromset(void)
if (IsContest())
gTasks[taskId].tBackgroundId = bg3;
else if (GetBankSide(gAnimBankTarget) == SIDE_PLAYER)
else if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
gTasks[taskId].tBackgroundId = bg2;
else
gTasks[taskId].tBackgroundId = bg1;
@@ -1269,21 +1265,21 @@ static void ScriptCmd_changebg(void)
s8 BattleAnimAdjustPanning(s8 pan)
{
if (!IsContest() && gBattleSpritesDataPtr->healthBoxesData[gAnimBankAttacker].statusAnimActive)
if (!IsContest() && gBattleSpritesDataPtr->healthBoxesData[gBattleAnimAttacker].statusAnimActive)
{
if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER)
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
pan = PAN_SIDE_OPPONENT;
else
pan = PAN_SIDE_PLAYER;
}
else if (IsContest())
{
if (gAnimBankAttacker != gAnimBankTarget || gAnimBankAttacker != 2 || pan != PAN_SIDE_OPPONENT)
if (gBattleAnimAttacker != gBattleAnimTarget || gBattleAnimAttacker != 2 || pan != PAN_SIDE_OPPONENT)
pan *= -1;
}
else if (GetBankSide(gAnimBankAttacker) == SIDE_PLAYER)
else if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
{
if (GetBankSide(gAnimBankTarget) == SIDE_PLAYER)
if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
{
if (pan == PAN_SIDE_OPPONENT)
pan = PAN_SIDE_PLAYER;
@@ -1291,7 +1287,7 @@ s8 BattleAnimAdjustPanning(s8 pan)
pan *= -1;
}
}
else if (GetBankSide(gAnimBankTarget) == SIDE_OPPONENT)
else if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_OPPONENT)
{
if (pan == PAN_SIDE_PLAYER)
pan = PAN_SIDE_OPPONENT;
@@ -1311,16 +1307,16 @@ s8 BattleAnimAdjustPanning(s8 pan)
s8 BattleAnimAdjustPanning2(s8 pan)
{
if (!IsContest() && gBattleSpritesDataPtr->healthBoxesData[gAnimBankAttacker].statusAnimActive)
if (!IsContest() && gBattleSpritesDataPtr->healthBoxesData[gBattleAnimAttacker].statusAnimActive)
{
if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER)
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
pan = PAN_SIDE_OPPONENT;
else
pan = PAN_SIDE_PLAYER;
}
else
{
if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER || IsContest())
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER || IsContest())
pan = -pan;
}
return pan;
@@ -1649,8 +1645,8 @@ static void ScriptCmd_waitsound(void)
{
if (++sSoundAnimFramesToWait > 90)
{
m4aMPlayStop(&gMPlay_SE1);
m4aMPlayStop(&gMPlay_SE2);
m4aMPlayStop(&gMPlayInfo_SE1);
m4aMPlayStop(&gMPlayInfo_SE2);
sSoundAnimFramesToWait = 0;
}
else
@@ -1699,13 +1695,13 @@ static void ScriptCmd_monbgprio_28(void)
wantedBank = sBattleAnimScriptPtr[1];
sBattleAnimScriptPtr += 2;
if (wantedBank != ANIM_BANK_ATTACKER)
bank = gAnimBankTarget;
if (wantedBank != ANIM_ATTACKER)
bank = gBattleAnimTarget;
else
bank = gAnimBankAttacker;
bank = gBattleAnimAttacker;
bankIdentity = GetBankIdentity(bank);
if (!IsContest() && (bankIdentity == IDENTITY_PLAYER_MON1 || bankIdentity == IDENTITY_OPPONENT_MON2))
bankIdentity = GetBattlerPosition(bank);
if (!IsContest() && (bankIdentity == B_POSITION_PLAYER_LEFT || bankIdentity == B_POSITION_OPPONENT_RIGHT))
{
SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2);
@@ -1730,15 +1726,15 @@ static void ScriptCmd_monbgprio_2A(void)
wantedBank = sBattleAnimScriptPtr[1];
sBattleAnimScriptPtr += 2;
if (GetBankSide(gAnimBankAttacker) != GetBankSide(gAnimBankTarget))
if (GetBattlerSide(gBattleAnimAttacker) != GetBattlerSide(gBattleAnimTarget))
{
if (wantedBank != ANIM_BANK_ATTACKER)
bank = gAnimBankTarget;
if (wantedBank != ANIM_ATTACKER)
bank = gBattleAnimTarget;
else
bank = gAnimBankAttacker;
bank = gBattleAnimAttacker;
bankIdentity = GetBankIdentity(bank);
if (!IsContest() && (bankIdentity == IDENTITY_PLAYER_MON1 || bankIdentity == IDENTITY_OPPONENT_MON2))
bankIdentity = GetBattlerPosition(bank);
if (!IsContest() && (bankIdentity == B_POSITION_PLAYER_LEFT || bankIdentity == B_POSITION_OPPONENT_RIGHT))
{
SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2);
@@ -1750,7 +1746,7 @@ static void ScriptCmd_invisible(void)
{
u8 spriteId;
spriteId = GetAnimBankSpriteId(sBattleAnimScriptPtr[1]);
spriteId = GetAnimBattlerSpriteId(sBattleAnimScriptPtr[1]);
if (spriteId != 0xFF)
gSprites[spriteId].invisible = 1;
@@ -1761,7 +1757,7 @@ static void ScriptCmd_visible(void)
{
u8 spriteId;
spriteId = GetAnimBankSpriteId(sBattleAnimScriptPtr[1]);
spriteId = GetAnimBattlerSpriteId(sBattleAnimScriptPtr[1]);
if (spriteId != 0xFF)
gSprites[spriteId].invisible = 0;
@@ -1777,17 +1773,17 @@ static void ScriptCmd_doublebattle_2D(void)
wantedBank = sBattleAnimScriptPtr[1];
sBattleAnimScriptPtr += 2;
if (!IsContest() && IsDoubleBattle()
&& GetBankSide(gAnimBankAttacker) == GetBankSide(gAnimBankTarget))
&& GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))
{
if (wantedBank == ANIM_BANK_ATTACKER)
if (wantedBank == ANIM_ATTACKER)
{
r4 = sub_80A8364(gAnimBankAttacker);
spriteId = GetAnimBankSpriteId(0);
r4 = sub_80A8364(gBattleAnimAttacker);
spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
}
else
{
r4 = sub_80A8364(gAnimBankTarget);
spriteId = GetAnimBankSpriteId(1);
r4 = sub_80A8364(gBattleAnimTarget);
spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);
}
if (spriteId != 0xFF)
{
@@ -1812,17 +1808,17 @@ static void ScriptCmd_doublebattle_2E(void)
wantedBank = sBattleAnimScriptPtr[1];
sBattleAnimScriptPtr += 2;
if (!IsContest() && IsDoubleBattle()
&& GetBankSide(gAnimBankAttacker) == GetBankSide(gAnimBankTarget))
&& GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))
{
if (wantedBank == ANIM_BANK_ATTACKER)
if (wantedBank == ANIM_ATTACKER)
{
r4 = sub_80A8364(gAnimBankAttacker);
spriteId = GetAnimBankSpriteId(0);
r4 = sub_80A8364(gBattleAnimAttacker);
spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
}
else
{
r4 = sub_80A8364(gAnimBankTarget);
spriteId = GetAnimBankSpriteId(1);
r4 = sub_80A8364(gBattleAnimTarget);
spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);
}
if (spriteId != 0xFF && r4 == 2)
@@ -1832,7 +1828,7 @@ static void ScriptCmd_doublebattle_2E(void)
static void ScriptCmd_stopsound(void)
{
m4aMPlayStop(&gMPlay_SE1);
m4aMPlayStop(&gMPlay_SE2);
m4aMPlayStop(&gMPlayInfo_SE1);
m4aMPlayStop(&gMPlayInfo_SE2);
sBattleAnimScriptPtr++;
}
+752
View File
@@ -0,0 +1,752 @@
#include "global.h"
#include "battle.h"
#include "sprite.h"
#include "constants/trainers.h"
#include "graphics.h"
#include "decompress.h"
#include "bg.h"
#include "palette.h"
#include "main.h"
#include "gpu_regs.h"
#include "link.h"
#include "battle_message.h"
#include "task.h"
#include "trig.h"
#include "sound.h"
#include "constants/songs.h"
#include "strings.h"
#include "window.h"
#include "text_window.h"
#include "menu.h"
#include "battle_setup.h"
struct BattleBackground
{
const void *tileset;
const void *tilemap;
const void *entryTileset;
const void *entryTilemap;
const void *palette;
};
extern const struct SpriteTemplate gUnknown_0831A9D0;
extern const struct SpriteTemplate gUnknown_0831A9E8;
extern const struct CompressedSpriteSheet gUnknown_0831AA00;
extern const struct BgTemplate gUnknown_0831AA08[4];
extern const struct WindowTemplate *gUnknown_0831ABA0[];
extern const struct BattleBackground gBattleTerrainTable[];
extern u16 gBattle_BG1_X;
extern u16 gBattle_BG1_Y;
extern u16 gBattle_BG2_X;
extern u16 gBattle_BG2_Y;
extern u8 GetCurrentMapBattleScene(void);
void sub_8035658(void)
{
ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(0, gUnknown_0831AA08, ARRAY_COUNT(gUnknown_0831AA08));
if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
{
gBattleScripting.field_24 = 1;
SetBgTilemapBuffer(1, gUnknown_02023060);
SetBgTilemapBuffer(2, gUnknown_02023060);
}
else
{
gBattleScripting.field_24 = 0;
}
InitWindows(gUnknown_0831ABA0[gBattleScripting.field_24]);
DeactivateAllTextPrinters();
}
void sub_80356D0(void)
{
DisableInterrupts(INTR_FLAG_HBLANK);
EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_VCOUNT | INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL);
sub_8035658();
SetGpuReg(REG_OFFSET_BLDCNT, 0);
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
SetGpuReg(REG_OFFSET_BLDY, 0);
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON | DISPCNT_WIN0_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
}
void ApplyPlayerChosenFrameToBattleMenu(void)
{
sub_809882C(2, 0x12, 0x10);
sub_809882C(2, 0x22, 0x10);
LoadCompressedPalette(gUnknown_08D85600, 0x50, 0x20);
if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
{
sub_81978B0(0x70);
copy_textbox_border_tile_patterns_to_vram(0, 0x30, 0x70);
gPlttBufferUnfaded[0x76] = 0;
CpuCopy16(&gPlttBufferUnfaded[0x76], &gPlttBufferFaded[0x76], 2);
}
}
void DrawMainBattleBackground(void)
{
if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_FRONTIER | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_x2000000))
{
LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000));
LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000));
LoadCompressedPalette(gBattleTerrainPalette_Frontier, 0x20, 0x60);
}
else if (gBattleTypeFlags & BATTLE_TYPE_GROUDON)
{
LZDecompressVram(gBattleTerrainTiles_Cave, (void*)(VRAM + 0x8000));
LZDecompressVram(gBattleTerrainTilemap_Cave, (void*)(VRAM + 0xD000));
LoadCompressedPalette(gBattleTerrainPalette_Groudon, 0x20, 0x60);
}
else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE)
{
LZDecompressVram(gBattleTerrainTiles_Water, (void*)(VRAM + 0x8000));
LZDecompressVram(gBattleTerrainTilemap_Water, (void*)(VRAM + 0xD000));
LoadCompressedPalette(gBattleTerrainPalette_Kyogre, 0x20, 0x60);
}
else if (gBattleTypeFlags & BATTLE_TYPE_RAYQUAZA)
{
LZDecompressVram(gBattleTerrainTiles_Rayquaza, (void*)(VRAM + 0x8000));
LZDecompressVram(gBattleTerrainTilemap_Rayquaza, (void*)(VRAM + 0xD000));
LoadCompressedPalette(gBattleTerrainPalette_Rayquaza, 0x20, 0x60);
}
else
{
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
{
u8 trainerClass = gTrainers[gTrainerBattleOpponent_A].trainerClass;
if (trainerClass == TRAINER_CLASS_LEADER)
{
LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000));
LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000));
LoadCompressedPalette(gBattleTerrainPalette_BuildingLeader, 0x20, 0x60);
return;
}
else if (trainerClass == TRAINER_CLASS_CHAMPION)
{
LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
LoadCompressedPalette(gBattleTerrainPalette_StadiumWallace, 0x20, 0x60);
return;
}
}
switch (GetCurrentMapBattleScene())
{
default:
case MAP_BATTLE_SCENE_NORMAL:
LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tileset, (void*)(VRAM + 0x8000));
LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tilemap, (void*)(VRAM + 0xD000));
LoadCompressedPalette(gBattleTerrainTable[gBattleTerrain].palette, 0x20, 0x60);
break;
case MAP_BATTLE_SCENE_GYM:
LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000));
LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000));
LoadCompressedPalette(gBattleTerrainPalette_BuildingGym, 0x20, 0x60);
break;
case MAP_BATTLE_SCENE_MAGMA:
LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
LoadCompressedPalette(gBattleTerrainPalette_StadiumMagma, 0x20, 0x60);
break;
case MAP_BATTLE_SCENE_AQUA:
LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
LoadCompressedPalette(gBattleTerrainPalette_StadiumAqua, 0x20, 0x60);
break;
case MAP_BATTLE_SCENE_SIDNEY:
LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
LoadCompressedPalette(gBattleTerrainPalette_StadiumSidney, 0x20, 0x60);
break;
case MAP_BATTLE_SCENE_PHOEBE:
LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
LoadCompressedPalette(gBattleTerrainPalette_StadiumPhoebe, 0x20, 0x60);
break;
case MAP_BATTLE_SCENE_GLACIA:
LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
LoadCompressedPalette(gBattleTerrainPalette_StadiumGlacia, 0x20, 0x60);
break;
case MAP_BATTLE_SCENE_DRAKE:
LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
LoadCompressedPalette(gBattleTerrainPalette_StadiumDrake, 0x20, 0x60);
break;
case MAP_BATTLE_SCENE_FRONTIER:
LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000));
LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000));
LoadCompressedPalette(gBattleTerrainPalette_Frontier, 0x20, 0x60);
break;
}
}
}
void LoadBattleTextboxAndBackground(void)
{
LZDecompressVram(gBattleTextboxTiles, (void*)(VRAM));
CopyToBgTilemapBuffer(0, gBattleTextboxTilemap, 0, 0);
CopyBgTilemapBufferToVram(0);
LoadCompressedPalette(gBattleTextboxPalette, 0, 0x40);
ApplyPlayerChosenFrameToBattleMenu();
DrawMainBattleBackground();
}
static void sub_8035AE4(u8 taskId, u8 bank, u8 bgId, u8 destX, u8 destY)
{
s32 i;
u16 var = 0;
u16 src[6];
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
if (gTasks[taskId].data[5] != 0)
{
switch (bank)
{
case 0:
var = 0x3F & gTasks[taskId].data[3];
break;
case 1:
var = (0xFC0 & gTasks[taskId].data[4]) >> 6;
break;
case 2:
var = (0xFC0 & gTasks[taskId].data[3]) >> 6;
break;
case 3:
var = 0x3F & gTasks[taskId].data[4];
break;
}
}
else
{
switch (bank)
{
case 0:
var = 0x3F & gTasks[taskId].data[3];
break;
case 1:
var = 0x3F & gTasks[taskId].data[4];
break;
case 2:
var = (0xFC0 & gTasks[taskId].data[3]) >> 6;
break;
case 3:
var = (0xFC0 & gTasks[taskId].data[4]) >> 6;
break;
}
}
for (i = 0; i < 3; i++)
{
src[i] = ((var & (3 << (i * 2))) >> (i * 2)) + 0x6001;
}
CopyToBgTilemapBufferRect_ChangePalette(bgId, src, destX, destY, 3, 1, 0x11);
CopyBgTilemapBufferToVram(bgId);
}
else
{
if (bank == gBattleScripting.multiplayerId)
var = gTasks[taskId].data[3];
else
var = gTasks[taskId].data[4];
for (i = 0; i < 6; i++)
{
src[i] = ((var & (3 << (i * 2))) >> (i * 2)) + 0x6001;
}
CopyToBgTilemapBufferRect_ChangePalette(bgId, src, destX, destY, 6, 1, 0x11);
CopyBgTilemapBufferToVram(bgId);
}
}
static void sub_8035C4C(void)
{
if (gBattleOutcome == B_OUTCOME_DREW)
{
BattleHandleAddTextPrinter(gText_Draw, 0x15);
}
else if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
if (gBattleOutcome == B_OUTCOME_WON)
{
switch (gLinkPlayers[gBattleScripting.multiplayerId].lp_field_18)
{
case 0:
BattleHandleAddTextPrinter(gText_Win, 0x16);
BattleHandleAddTextPrinter(gText_Loss, 0x17);
break;
case 1:
BattleHandleAddTextPrinter(gText_Win, 0x17);
BattleHandleAddTextPrinter(gText_Loss, 0x16);
break;
case 2:
BattleHandleAddTextPrinter(gText_Win, 0x16);
BattleHandleAddTextPrinter(gText_Loss, 0x17);
break;
case 3:
BattleHandleAddTextPrinter(gText_Win, 0x17);
BattleHandleAddTextPrinter(gText_Loss, 0x16);
break;
}
}
else
{
switch (gLinkPlayers[gBattleScripting.multiplayerId].lp_field_18)
{
case 0:
BattleHandleAddTextPrinter(gText_Win, 0x17);
BattleHandleAddTextPrinter(gText_Loss, 0x16);
break;
case 1:
BattleHandleAddTextPrinter(gText_Win, 0x16);
BattleHandleAddTextPrinter(gText_Loss, 0x17);
break;
case 2:
BattleHandleAddTextPrinter(gText_Win, 0x17);
BattleHandleAddTextPrinter(gText_Loss, 0x16);
break;
case 3:
BattleHandleAddTextPrinter(gText_Win, 0x16);
BattleHandleAddTextPrinter(gText_Loss, 0x17);
break;
}
}
}
else if (gBattleOutcome == B_OUTCOME_WON)
{
if (gLinkPlayers[gBattleScripting.multiplayerId].lp_field_18 != 0)
{
BattleHandleAddTextPrinter(gText_Win, 0x17);
BattleHandleAddTextPrinter(gText_Loss, 0x16);
}
else
{
BattleHandleAddTextPrinter(gText_Win, 0x16);
BattleHandleAddTextPrinter(gText_Loss, 0x17);
}
}
else
{
if (gLinkPlayers[gBattleScripting.multiplayerId].lp_field_18 != 0)
{
BattleHandleAddTextPrinter(gText_Win, 0x16);
BattleHandleAddTextPrinter(gText_Loss, 0x17);
}
else
{
BattleHandleAddTextPrinter(gText_Win, 0x17);
BattleHandleAddTextPrinter(gText_Loss, 0x16);
}
}
}
void sub_8035D74(u8 taskId)
{
struct LinkPlayer *linkPlayer;
u8 *name;
s32 i, palId;
switch (gTasks[taskId].data[0])
{
case 0:
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
name = gLinkPlayers[i].name;
linkPlayer = &gLinkPlayers[i];
switch (linkPlayer->lp_field_18)
{
case 0:
BattleHandleAddTextPrinter(name, 0x11);
sub_8035AE4(taskId, linkPlayer->lp_field_18, 1, 2, 4);
break;
case 1:
BattleHandleAddTextPrinter(name, 0x12);
sub_8035AE4(taskId, linkPlayer->lp_field_18, 2, 2, 4);
break;
case 2:
BattleHandleAddTextPrinter(name, 0x13);
sub_8035AE4(taskId, linkPlayer->lp_field_18, 1, 2, 8);
break;
case 3:
BattleHandleAddTextPrinter(name, 0x14);
sub_8035AE4(taskId, linkPlayer->lp_field_18, 2, 2, 8);
break;
}
}
}
else
{
u8 playerId = gBattleScripting.multiplayerId;
u8 opponentId = playerId ^ BIT_SIDE;
u8 opponentId_copy = opponentId;
if (gLinkPlayers[playerId].lp_field_18 != 0)
opponentId = playerId, playerId = opponentId_copy;
name = gLinkPlayers[playerId].name;
BattleHandleAddTextPrinter(name, 0xF);
name = gLinkPlayers[opponentId].name;
BattleHandleAddTextPrinter(name, 0x10);
sub_8035AE4(taskId, playerId, 1, 2, 7);
sub_8035AE4(taskId, opponentId, 2, 2, 7);
}
gTasks[taskId].data[0]++;
break;
case 1:
palId = AllocSpritePalette(0x2710);
gPlttBufferUnfaded[palId * 16 + 0x10F] = gPlttBufferFaded[palId * 16 + 0x10F] = 0x7FFF;
gBattleStruct->field_7D = CreateSprite(&gUnknown_0831A9D0, 111, 80, 0);
gBattleStruct->field_7E = CreateSprite(&gUnknown_0831A9E8, 129, 80, 0);
gSprites[gBattleStruct->field_7D].invisible = 1;
gSprites[gBattleStruct->field_7E].invisible = 1;
gTasks[taskId].data[0]++;
break;
case 2:
if (gTasks[taskId].data[5] != 0)
{
gBattle_BG1_X = -(20) - (Sin2(gTasks[taskId].data[1]) / 32);
gBattle_BG2_X = -(140) - (Sin2(gTasks[taskId].data[2]) / 32);
gBattle_BG1_Y = -36;
gBattle_BG2_Y = -36;
}
else
{
gBattle_BG1_X = -(20) - (Sin2(gTasks[taskId].data[1]) / 32);
gBattle_BG1_Y = (Cos2(gTasks[taskId].data[1]) / 32) - 164;
gBattle_BG2_X = -(140) - (Sin2(gTasks[taskId].data[2]) / 32);
gBattle_BG2_Y = (Cos2(gTasks[taskId].data[2]) / 32) - 164;
}
if (gTasks[taskId].data[2] != 0)
{
gTasks[taskId].data[2] -= 2;
gTasks[taskId].data[1] += 2;
}
else
{
if (gTasks[taskId].data[5] != 0)
sub_8035C4C();
PlaySE(SE_W231);
DestroyTask(taskId);
gSprites[gBattleStruct->field_7D].invisible = 0;
gSprites[gBattleStruct->field_7E].invisible = 0;
gSprites[gBattleStruct->field_7E].oam.tileNum += 0x40;
gSprites[gBattleStruct->field_7D].data[0] = 0;
gSprites[gBattleStruct->field_7E].data[0] = 1;
gSprites[gBattleStruct->field_7D].data[1] = gSprites[gBattleStruct->field_7D].pos1.x;
gSprites[gBattleStruct->field_7E].data[1] = gSprites[gBattleStruct->field_7E].pos1.x;
gSprites[gBattleStruct->field_7D].data[2] = 0;
gSprites[gBattleStruct->field_7E].data[2] = 0;
}
break;
}
}
void LoadBattleEntryBackground(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
LZDecompressVram(gUnknown_08D778F0, (void*)(VRAM + 0x4000));
LZDecompressVram(gUnknown_08D77B0C, (void*)(VRAM + 0x10000));
LoadCompressedPalette(gUnknown_08D77AE4, 0x60, 0x20);
SetBgAttribute(1, BG_CTRL_ATTR_MAPBASEINDEX, 1);
SetGpuReg(REG_OFFSET_BG1CNT, 0x5C04);
CopyToBgTilemapBuffer(1, gUnknown_08D779D8, 0, 0);
CopyToBgTilemapBuffer(2, gUnknown_08D779D8, 0, 0);
CopyBgTilemapBufferToVram(1);
CopyBgTilemapBufferToVram(2);
SetGpuReg(REG_OFFSET_WININ, 0x36);
SetGpuReg(REG_OFFSET_WINOUT, 0x36);
gBattle_BG1_Y = 0xFF5C;
gBattle_BG2_Y = 0xFF5C;
LoadCompressedObjectPicUsingHeap(&gUnknown_0831AA00);
}
else if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_EREADER_TRAINER))
{
if (!(gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) || gPartnerTrainerId == STEVEN_PARTNER_ID)
{
LZDecompressVram(gBattleTerrainAnimTiles_Building, (void*)(VRAM + 0x4000));
LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void*)(VRAM + 0xE000));
}
else
{
SetBgAttribute(1, BG_CTRL_ATTR_VISIBLE, 2);
SetBgAttribute(2, BG_CTRL_ATTR_VISIBLE, 2);
CopyToBgTilemapBuffer(1, gUnknown_08D857A8, 0, 0);
CopyToBgTilemapBuffer(2, gUnknown_08D85A1C, 0, 0);
CopyBgTilemapBufferToVram(1);
CopyBgTilemapBufferToVram(2);
}
}
else if (gBattleTypeFlags & BATTLE_TYPE_GROUDON)
{
LZDecompressVram(gBattleTerrainAnimTiles_Cave, (void*)(VRAM + 0x4000));
LZDecompressVram(gBattleTerrainAnimTilemap_Cave, (void*)(VRAM + 0xE000));
}
else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE)
{
LZDecompressVram(gBattleTerrainAnimTiles_Underwater, (void*)(VRAM + 0x4000));
LZDecompressVram(gBattleTerrainAnimTilemap_Underwater, (void*)(VRAM + 0xE000));
}
else if (gBattleTypeFlags & BATTLE_TYPE_RAYQUAZA)
{
LZDecompressVram(gBattleTerrainAnimTiles_Rayquaza, (void*)(VRAM + 0x4000));
LZDecompressVram(gBattleTerrainAnimTilemap_Rayquaza, (void*)(VRAM + 0xE000));
}
else
{
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
{
u8 trainerClass = gTrainers[gTrainerBattleOpponent_A].trainerClass;
if (trainerClass == TRAINER_CLASS_LEADER)
{
LZDecompressVram(gBattleTerrainAnimTiles_Building, (void*)(VRAM + 0x4000));
LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void*)(VRAM + 0xE000));
return;
}
else if (trainerClass == TRAINER_CLASS_CHAMPION)
{
LZDecompressVram(gBattleTerrainAnimTiles_Building, (void*)(VRAM + 0x4000));
LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void*)(VRAM + 0xE000));
return;
}
}
if (GetCurrentMapBattleScene() == MAP_BATTLE_SCENE_NORMAL)
{
LZDecompressVram(gBattleTerrainTable[gBattleTerrain].entryTileset, (void*)(VRAM + 0x4000));
LZDecompressVram(gBattleTerrainTable[gBattleTerrain].entryTilemap, (void*)(VRAM + 0xE000));
}
else
{
LZDecompressVram(gBattleTerrainAnimTiles_Building, (void*)(VRAM + 0x4000));
LZDecompressVram(gBattleTerrainAnimTilemap_Building, (void*)(VRAM + 0xE000));
}
}
}
bool8 LoadChosenBattleElement(u8 caseId)
{
bool8 ret = FALSE;
switch (caseId)
{
case 0:
LZDecompressVram(gBattleTextboxTiles, (void*)(VRAM));
break;
case 1:
CopyToBgTilemapBuffer(0, gBattleTextboxTilemap, 0, 0);
CopyBgTilemapBufferToVram(0);
break;
case 2:
LoadCompressedPalette(gBattleTextboxPalette, 0, 0x40);
break;
case 3:
if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_EREADER_TRAINER))
{
LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000));
}
else if (gBattleTypeFlags & BATTLE_TYPE_GROUDON)
{
LZDecompressVram(gBattleTerrainTiles_Cave, (void*)(VRAM + 0x8000));
}
else
{
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
{
u8 trainerClass = gTrainers[gTrainerBattleOpponent_A].trainerClass;
if (trainerClass == TRAINER_CLASS_LEADER)
{
LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000));
break;
}
else if (trainerClass == TRAINER_CLASS_CHAMPION)
{
LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
break;
}
}
switch (GetCurrentMapBattleScene())
{
default:
case MAP_BATTLE_SCENE_NORMAL:
LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tileset, (void*)(VRAM + 0x8000));
break;
case MAP_BATTLE_SCENE_GYM:
LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000));
break;
case MAP_BATTLE_SCENE_MAGMA:
LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
break;
case MAP_BATTLE_SCENE_AQUA:
LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
break;
case MAP_BATTLE_SCENE_SIDNEY:
LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
break;
case MAP_BATTLE_SCENE_PHOEBE:
LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
break;
case MAP_BATTLE_SCENE_GLACIA:
LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
break;
case MAP_BATTLE_SCENE_DRAKE:
LZDecompressVram(gBattleTerrainTiles_Stadium, (void*)(VRAM + 0x8000));
break;
case MAP_BATTLE_SCENE_FRONTIER:
LZDecompressVram(gBattleTerrainTiles_Building, (void*)(VRAM + 0x8000));
break;
}
}
break;
case 4:
if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_EREADER_TRAINER))
{
LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000));
}
else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON)
{
if (gGameVersion == VERSION_RUBY)
LZDecompressVram(gBattleTerrainTilemap_Cave, (void*)(VRAM + 0xD000));
else
LZDecompressVram(gBattleTerrainTilemap_Water, (void*)(VRAM + 0xD000));
}
else
{
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
{
u8 trainerClass = gTrainers[gTrainerBattleOpponent_A].trainerClass;
if (trainerClass == TRAINER_CLASS_LEADER)
{
LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000));
break;
}
else if (trainerClass == TRAINER_CLASS_CHAMPION)
{
LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
break;
}
}
switch (GetCurrentMapBattleScene())
{
default:
case MAP_BATTLE_SCENE_NORMAL:
LZDecompressVram(gBattleTerrainTable[gBattleTerrain].tilemap, (void*)(VRAM + 0xD000));
break;
case MAP_BATTLE_SCENE_GYM:
LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000));
break;
case MAP_BATTLE_SCENE_MAGMA:
LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
break;
case MAP_BATTLE_SCENE_AQUA:
LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
break;
case MAP_BATTLE_SCENE_SIDNEY:
LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
break;
case MAP_BATTLE_SCENE_PHOEBE:
LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
break;
case MAP_BATTLE_SCENE_GLACIA:
LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
break;
case MAP_BATTLE_SCENE_DRAKE:
LZDecompressVram(gBattleTerrainTilemap_Stadium, (void*)(VRAM + 0xD000));
break;
case MAP_BATTLE_SCENE_FRONTIER:
LZDecompressVram(gBattleTerrainTilemap_Building, (void*)(VRAM + 0xD000));
break;
}
}
break;
case 5:
if (gBattleTypeFlags & (BATTLE_TYPE_FRONTIER | BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000 | BATTLE_TYPE_EREADER_TRAINER))
{
LoadCompressedPalette(gBattleTerrainPalette_Frontier, 0x20, 0x60);
}
else if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON)
{
if (gGameVersion == VERSION_RUBY)
LoadCompressedPalette(gBattleTerrainPalette_Groudon, 0x20, 0x60);
else
LoadCompressedPalette(gBattleTerrainPalette_Kyogre, 0x20, 0x60);
}
else
{
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
{
u8 trainerClass = gTrainers[gTrainerBattleOpponent_A].trainerClass;
if (trainerClass == TRAINER_CLASS_LEADER)
{
LoadCompressedPalette(gBattleTerrainPalette_BuildingLeader, 0x20, 0x60);
break;
}
else if (trainerClass == TRAINER_CLASS_CHAMPION)
{
LoadCompressedPalette(gBattleTerrainPalette_StadiumWallace, 0x20, 0x60);
break;
}
}
switch (GetCurrentMapBattleScene())
{
default:
case MAP_BATTLE_SCENE_NORMAL:
LoadCompressedPalette(gBattleTerrainTable[gBattleTerrain].palette, 0x20, 0x60);
break;
case MAP_BATTLE_SCENE_GYM:
LoadCompressedPalette(gBattleTerrainPalette_BuildingGym, 0x20, 0x60);
break;
case MAP_BATTLE_SCENE_MAGMA:
LoadCompressedPalette(gBattleTerrainPalette_StadiumMagma, 0x20, 0x60);
break;
case MAP_BATTLE_SCENE_AQUA:
LoadCompressedPalette(gBattleTerrainPalette_StadiumAqua, 0x20, 0x60);
break;
case MAP_BATTLE_SCENE_SIDNEY:
LoadCompressedPalette(gBattleTerrainPalette_StadiumSidney, 0x20, 0x60);
break;
case MAP_BATTLE_SCENE_PHOEBE:
LoadCompressedPalette(gBattleTerrainPalette_StadiumPhoebe, 0x20, 0x60);
break;
case MAP_BATTLE_SCENE_GLACIA:
LoadCompressedPalette(gBattleTerrainPalette_StadiumGlacia, 0x20, 0x60);
break;
case MAP_BATTLE_SCENE_DRAKE:
LoadCompressedPalette(gBattleTerrainPalette_StadiumDrake, 0x20, 0x60);
break;
case MAP_BATTLE_SCENE_FRONTIER:
LoadCompressedPalette(gBattleTerrainPalette_Frontier, 0x20, 0x60);
break;
}
}
break;
case 6:
ApplyPlayerChosenFrameToBattleMenu();
break;
default:
ret = TRUE;
break;
}
return ret;
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+89 -102
View File
@@ -4,11 +4,12 @@
#include "battle_message.h"
#include "battle_interface.h"
#include "battle_anim.h"
#include "constants/battle_anim.h"
#include "pokemon.h"
#include "link.h"
#include "util.h"
#include "main.h"
#include "songs.h"
#include "constants/songs.h"
#include "sound.h"
#include "window.h"
#include "m4a.h"
@@ -19,27 +20,13 @@
#include "reshow_battle_screen.h"
#include "pokeball.h"
#include "data2.h"
#include "pokeblock.h"
#include "item_use.h"
extern u32 gBattleExecBuffer;
extern u8 gActiveBank;
extern u8 gBankSpriteIds[BATTLE_BANKS_COUNT];
extern u8 gActionSelectionCursor[BATTLE_BANKS_COUNT];
extern u8 gNoOfAllBanks;
extern bool8 gDoingBattleAnim;
extern void (*gBattleBankFunc[BATTLE_BANKS_COUNT])(void);
extern void (*gPreBattleCallback1)(void);
extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
extern u8 gBattleBufferA[BATTLE_BANKS_COUNT][0x200];
extern u8 gBattleBufferB[BATTLE_BANKS_COUNT][0x200];
extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT];
extern struct BattlePokemon gBattleMons[MAX_BATTLERS_COUNT];
extern struct SpriteTemplate gUnknown_0202499C;
extern u16 gScriptItemId;
extern u8 gHealthBoxesIds[BATTLE_BANKS_COUNT];
extern u8 gBattleOutcome;
extern u16 gBattle_BG0_X;
extern u16 gBattle_BG0_Y;
extern u8 gBankInMenu;
extern u16 gUnknown_020243FC;
extern const struct CompressedSpritePalette gTrainerBackPicPaletteTable[];
@@ -66,7 +53,7 @@ static void SafariHandleBallThrowAnim(void);
static void SafariHandlePause(void);
static void SafariHandleMoveAnimation(void);
static void SafariHandlePrintString(void);
static void SafariHandlePrintStringPlayerOnly(void);
static void SafariHandlePrintSelectionString(void);
static void SafariHandleChooseAction(void);
static void SafariHandleUnknownYesNoBox(void);
static void SafariHandleChooseMove(void);
@@ -92,7 +79,7 @@ static void SafariHandleCmd39(void);
static void SafariHandleCmd40(void);
static void SafariHandleHitAnimation(void);
static void SafariHandleCmd42(void);
static void SafariHandleEffectivenessSound(void);
static void SafariHandlePlaySE(void);
static void SafariHandlePlayFanfareOrBGM(void);
static void SafariHandleFaintingCry(void);
static void SafariHandleIntroSlide(void);
@@ -130,7 +117,7 @@ static void (*const sSafariBufferCommands[CONTROLLER_CMDS_COUNT])(void) =
SafariHandlePause,
SafariHandleMoveAnimation,
SafariHandlePrintString,
SafariHandlePrintStringPlayerOnly,
SafariHandlePrintSelectionString,
SafariHandleChooseAction,
SafariHandleUnknownYesNoBox,
SafariHandleChooseMove,
@@ -156,7 +143,7 @@ static void (*const sSafariBufferCommands[CONTROLLER_CMDS_COUNT])(void) =
SafariHandleCmd40,
SafariHandleHitAnimation,
SafariHandleCmd42,
SafariHandleEffectivenessSound,
SafariHandlePlaySE,
SafariHandlePlayFanfareOrBGM,
SafariHandleFaintingCry,
SafariHandleIntroSlide,
@@ -178,15 +165,15 @@ static void nullsub_114(void)
void SetControllerToSafari(void)
{
gBattleBankFunc[gActiveBank] = SafariBufferRunCommand;
gBattlerControllerFuncs[gActiveBattler] = SafariBufferRunCommand;
}
static void SafariBufferRunCommand(void)
{
if (gBattleExecBuffer & gBitTable[gActiveBank])
if (gBattleControllerExecFlags & gBitTable[gActiveBattler])
{
if (gBattleBufferA[gActiveBank][0] < ARRAY_COUNT(sSafariBufferCommands))
sSafariBufferCommands[gBattleBufferA[gActiveBank][0]]();
if (gBattleBufferA[gActiveBattler][0] < ARRAY_COUNT(sSafariBufferCommands))
sSafariBufferCommands[gBattleBufferA[gActiveBattler][0]]();
else
SafariBufferExecCompleted();
}
@@ -198,68 +185,68 @@ static void HandleInputChooseAction(void)
{
PlaySE(SE_SELECT);
switch (gActionSelectionCursor[gActiveBank])
switch (gActionSelectionCursor[gActiveBattler])
{
case 0:
EmitTwoReturnValues(1, ACTION_SAFARI_ZONE_BALL, 0);
BtlController_EmitTwoReturnValues(1, B_ACTION_SAFARI_BALL, 0);
break;
case 1:
EmitTwoReturnValues(1, ACTION_POKEBLOCK_CASE, 0);
BtlController_EmitTwoReturnValues(1, B_ACTION_SAFARI_POKEBLOCK, 0);
break;
case 2:
EmitTwoReturnValues(1, ACTION_GO_NEAR, 0);
BtlController_EmitTwoReturnValues(1, B_ACTION_SAFARI_GO_NEAR, 0);
break;
case 3:
EmitTwoReturnValues(1, ACTION_SAFARI_ZONE_RUN, 0);
BtlController_EmitTwoReturnValues(1, B_ACTION_SAFARI_RUN, 0);
break;
}
SafariBufferExecCompleted();
}
else if (gMain.newKeys & DPAD_LEFT)
{
if (gActionSelectionCursor[gActiveBank] & 1)
if (gActionSelectionCursor[gActiveBattler] & 1)
{
PlaySE(SE_SELECT);
ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBank]);
gActionSelectionCursor[gActiveBank] ^= 1;
ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBank], 0);
ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);
gActionSelectionCursor[gActiveBattler] ^= 1;
ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);
}
}
else if (gMain.newKeys & DPAD_RIGHT)
{
if (!(gActionSelectionCursor[gActiveBank] & 1))
if (!(gActionSelectionCursor[gActiveBattler] & 1))
{
PlaySE(SE_SELECT);
ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBank]);
gActionSelectionCursor[gActiveBank] ^= 1;
ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBank], 0);
ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);
gActionSelectionCursor[gActiveBattler] ^= 1;
ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);
}
}
else if (gMain.newKeys & DPAD_UP)
{
if (gActionSelectionCursor[gActiveBank] & 2)
if (gActionSelectionCursor[gActiveBattler] & 2)
{
PlaySE(SE_SELECT);
ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBank]);
gActionSelectionCursor[gActiveBank] ^= 2;
ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBank], 0);
ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);
gActionSelectionCursor[gActiveBattler] ^= 2;
ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);
}
}
else if (gMain.newKeys & DPAD_DOWN)
{
if (!(gActionSelectionCursor[gActiveBank] & 2))
if (!(gActionSelectionCursor[gActiveBattler] & 2))
{
PlaySE(SE_SELECT);
ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBank]);
gActionSelectionCursor[gActiveBank] ^= 2;
ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBank], 0);
ActionSelectionDestroyCursorAt(gActionSelectionCursor[gActiveBattler]);
gActionSelectionCursor[gActiveBattler] ^= 2;
ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);
}
}
}
static void CompleteOnBankSpriteCallbackDummy(void)
{
if (gSprites[gBankSpriteIds[gActiveBank]].callback == SpriteCallbackDummy)
if (gSprites[gBattlerSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
SafariBufferExecCompleted();
}
@@ -271,7 +258,7 @@ static void CompleteOnInactiveTextPrinter(void)
static void CompleteOnHealthboxSpriteCallbackDummy(void)
{
if (gSprites[gHealthBoxesIds[gActiveBank]].callback == SpriteCallbackDummy)
if (gSprites[gHealthboxSpriteIds[gActiveBattler]].callback == SpriteCallbackDummy)
SafariBufferExecCompleted();
}
@@ -287,17 +274,17 @@ static void sub_81595E4(void)
static void CompleteOnSpecialAnimDone(void)
{
if (!gDoingBattleAnim || !gBattleSpritesDataPtr->healthBoxesData[gActiveBank].specialAnimActive)
if (!gDoingBattleAnim || !gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].specialAnimActive)
SafariBufferExecCompleted();
}
static void OpenPokeblockCase(void)
static void SafariOpenPokeblockCase(void)
{
if (!gPaletteFade.active)
{
gBattleBankFunc[gActiveBank] = CompleteWhenChosePokeblock;
gBattlerControllerFuncs[gActiveBattler] = CompleteWhenChosePokeblock;
FreeAllWindowBuffers();
sub_81358F4();
OpenPokeblockCaseInBattle();
}
}
@@ -305,36 +292,36 @@ static void CompleteWhenChosePokeblock(void)
{
if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active)
{
EmitOneReturnValue(1, gScriptItemId);
BtlController_EmitOneReturnValue(1, gSpecialVar_ItemId);
SafariBufferExecCompleted();
}
}
static void CompleteOnFinishedBattleAnimation(void)
{
if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].animFromTableActive)
if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].animFromTableActive)
SafariBufferExecCompleted();
}
static void SafariBufferExecCompleted(void)
{
gBattleBankFunc[gActiveBank] = SafariBufferRunCommand;
gBattlerControllerFuncs[gActiveBattler] = SafariBufferRunCommand;
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
u8 playerId = GetMultiplayerId();
PrepareBufferDataTransferLink(2, 4, &playerId);
gBattleBufferA[gActiveBank][0] = CONTROLLER_TERMINATOR_NOP;
gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP;
}
else
{
gBattleExecBuffer &= ~gBitTable[gActiveBank];
gBattleControllerExecFlags &= ~gBitTable[gActiveBattler];
}
}
static void CompleteOnFinishedStatusAnimation(void)
{
if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBank].statusAnimActive)
if (!gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].statusAnimActive)
SafariBufferExecCompleted();
}
@@ -375,18 +362,18 @@ static void SafariHandleReturnMonToBall(void)
static void SafariHandleDrawTrainerPic(void)
{
DecompressTrainerBackPic(gSaveBlock2Ptr->playerGender, gActiveBank);
sub_806A12C(gSaveBlock2Ptr->playerGender, GetBankIdentity(gActiveBank));
gBankSpriteIds[gActiveBank] = CreateSprite(
DecompressTrainerBackPic(gSaveBlock2Ptr->playerGender, gActiveBattler);
sub_806A12C(gSaveBlock2Ptr->playerGender, GetBattlerPosition(gActiveBattler));
gBattlerSpriteIds[gActiveBattler] = CreateSprite(
&gUnknown_0202499C,
80,
(8 - gTrainerBackPicCoords[gSaveBlock2Ptr->playerGender].coords) * 4 + 80,
30);
gSprites[gBankSpriteIds[gActiveBank]].oam.paletteNum = gActiveBank;
gSprites[gBankSpriteIds[gActiveBank]].pos2.x = 240;
gSprites[gBankSpriteIds[gActiveBank]].data0 = -2;
gSprites[gBankSpriteIds[gActiveBank]].callback = sub_805D7AC;
gBattleBankFunc[gActiveBank] = CompleteOnBankSpriteCallbackDummy;
gSprites[gBattlerSpriteIds[gActiveBattler]].oam.paletteNum = gActiveBattler;
gSprites[gBattlerSpriteIds[gActiveBattler]].pos2.x = 240;
gSprites[gBattlerSpriteIds[gActiveBattler]].data[0] = -2;
gSprites[gBattlerSpriteIds[gActiveBattler]].callback = sub_805D7AC;
gBattlerControllerFuncs[gActiveBattler] = CompleteOnBankSpriteCallbackDummy;
}
static void SafariHandleTrainerSlide(void)
@@ -413,18 +400,18 @@ static void SafariHandleSuccessBallThrowAnim(void)
{
gBattleSpritesDataPtr->animationData->ballThrowCaseId = BALL_3_SHAKES_SUCCESS;
gDoingBattleAnim = TRUE;
DoSpecialBattleAnimation(gActiveBank, gActiveBank, GetBankByIdentity(IDENTITY_OPPONENT_MON1), B_ANIM_SAFARI_BALL_THROW);
gBattleBankFunc[gActiveBank] = CompleteOnSpecialAnimDone;
InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_SAFARI_BALL_THROW);
gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone;
}
static void SafariHandleBallThrowAnim(void)
{
u8 ballThrowCaseId = gBattleBufferA[gActiveBank][1];
u8 ballThrowCaseId = gBattleBufferA[gActiveBattler][1];
gBattleSpritesDataPtr->animationData->ballThrowCaseId = ballThrowCaseId;
gDoingBattleAnim = TRUE;
DoSpecialBattleAnimation(gActiveBank, gActiveBank, GetBankByIdentity(IDENTITY_OPPONENT_MON1), B_ANIM_SAFARI_BALL_THROW);
gBattleBankFunc[gActiveBank] = CompleteOnSpecialAnimDone;
InitAndLaunchSpecialAnimation(gActiveBattler, gActiveBattler, GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), B_ANIM_SAFARI_BALL_THROW);
gBattlerControllerFuncs[gActiveBattler] = CompleteOnSpecialAnimDone;
}
static void SafariHandlePause(void)
@@ -443,15 +430,15 @@ static void SafariHandlePrintString(void)
gBattle_BG0_X = 0;
gBattle_BG0_Y = 0;
stringId = (u16*)(&gBattleBufferA[gActiveBank][2]);
stringId = (u16*)(&gBattleBufferA[gActiveBattler][2]);
BufferStringBattle(*stringId);
BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
gBattleBankFunc[gActiveBank] = CompleteOnInactiveTextPrinter;
gBattlerControllerFuncs[gActiveBattler] = CompleteOnInactiveTextPrinter;
}
static void SafariHandlePrintStringPlayerOnly(void)
static void SafariHandlePrintSelectionString(void)
{
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
SafariHandlePrintString();
else
SafariBufferExecCompleted();
@@ -463,7 +450,7 @@ static void HandleChooseActionAfterDma3(void)
{
gBattle_BG0_X = 0;
gBattle_BG0_Y = 160;
gBattleBankFunc[gActiveBank] = HandleInputChooseAction;
gBattlerControllerFuncs[gActiveBattler] = HandleInputChooseAction;
}
}
@@ -471,13 +458,13 @@ static void SafariHandleChooseAction(void)
{
s32 i;
gBattleBankFunc[gActiveBank] = HandleChooseActionAfterDma3;
gBattlerControllerFuncs[gActiveBattler] = HandleChooseActionAfterDma3;
BattleHandleAddTextPrinter(gText_SafariZoneMenu, 2);
for (i = 0; i < 4; i++)
ActionSelectionDestroyCursorAt(i);
ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBank], 0);
ActionSelectionCreateCursorAt(gActionSelectionCursor[gActiveBattler], 0);
BattleStringExpandPlaceholdersToDisplayedString(gText_WhatWillPkmnDo2);
BattleHandleAddTextPrinter(gDisplayedStringBattle, 1);
}
@@ -497,8 +484,8 @@ static void SafariHandleChooseItem(void)
s32 i;
BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
gBattleBankFunc[gActiveBank] = OpenPokeblockCase;
gBankInMenu = gActiveBank;
gBattlerControllerFuncs[gActiveBattler] = SafariOpenPokeblockCase;
gBattlerInMenuId = gActiveBattler;
}
static void SafariHandleChoosePokemon(void)
@@ -523,7 +510,7 @@ static void SafariHandleExpUpdate(void)
static void SafariHandleStatusIconUpdate(void)
{
UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], HEALTHBOX_SAFARI_BALLS_TEXT);
UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_SAFARI_BALLS_TEXT);
SafariBufferExecCompleted();
}
@@ -607,29 +594,29 @@ static void SafariHandleCmd42(void)
SafariBufferExecCompleted();
}
static void SafariHandleEffectivenessSound(void)
static void SafariHandlePlaySE(void)
{
s8 pan;
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
pan = PAN_SIDE_PLAYER;
else
pan = PAN_SIDE_OPPONENT;
PlaySE12WithPanning(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8), pan);
PlaySE12WithPanning(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8), pan);
SafariBufferExecCompleted();
}
static void SafariHandlePlayFanfareOrBGM(void)
{
if (gBattleBufferA[gActiveBank][3])
if (gBattleBufferA[gActiveBattler][3])
{
BattleMusicStop();
PlayBGM(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
BattleStopLowHpSound();
PlayBGM(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
}
else
{
PlayFanfare(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8));
PlayFanfare(gBattleBufferA[gActiveBattler][1] | (gBattleBufferA[gActiveBattler][2] << 8));
}
SafariBufferExecCompleted();
@@ -637,7 +624,7 @@ static void SafariHandlePlayFanfareOrBGM(void)
static void SafariHandleFaintingCry(void)
{
u16 species = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES);
u16 species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES);
PlayCry1(species, 25);
SafariBufferExecCompleted();
@@ -645,17 +632,17 @@ static void SafariHandleFaintingCry(void)
static void SafariHandleIntroSlide(void)
{
HandleIntroSlide(gBattleBufferA[gActiveBank][1]);
gUnknown_020243FC |= 1;
HandleIntroSlide(gBattleBufferA[gActiveBattler][1]);
gIntroSlideFlags |= 1;
SafariBufferExecCompleted();
}
static void SafariHandleIntroTrainerBallThrow(void)
{
UpdateHealthboxAttribute(gHealthBoxesIds[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], HEALTHBOX_SAFARI_ALL_TEXT);
sub_8076918(gActiveBank);
SetHealthboxSpriteVisible(gHealthBoxesIds[gActiveBank]);
gBattleBankFunc[gActiveBank] = CompleteOnHealthboxSpriteCallbackDummy;
UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_SAFARI_ALL_TEXT);
sub_8076918(gActiveBattler);
SetHealthboxSpriteVisible(gHealthboxSpriteIds[gActiveBattler]);
gBattlerControllerFuncs[gActiveBattler] = CompleteOnHealthboxSpriteCallbackDummy;
}
static void SafariHandleDrawPartyStatusSummary(void)
@@ -680,13 +667,13 @@ static void SafariHandleSpriteInvisibility(void)
static void SafariHandleBattleAnimation(void)
{
u8 animationId = gBattleBufferA[gActiveBank][1];
u16 argument = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8);
u8 animationId = gBattleBufferA[gActiveBattler][1];
u16 argument = gBattleBufferA[gActiveBattler][2] | (gBattleBufferA[gActiveBattler][3] << 8);
if (DoBattleAnimationFromTable(gActiveBank, gActiveBank, gActiveBank, animationId, argument))
if (TryHandleLaunchBattleTableAnimation(gActiveBattler, gActiveBattler, gActiveBattler, animationId, argument))
SafariBufferExecCompleted();
else
gBattleBankFunc[gActiveBank] = CompleteOnFinishedBattleAnimation;
gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedBattleAnimation;
}
static void SafariHandleLinkStandbyMsg(void)
@@ -701,12 +688,12 @@ static void SafariHandleResetActionMoveSelection(void)
static void SafariHandleCmd55(void)
{
gBattleOutcome = gBattleBufferA[gActiveBank][1];
gBattleOutcome = gBattleBufferA[gActiveBattler][1];
FadeOutMapMusic(5);
BeginFastPaletteFade(3);
SafariBufferExecCompleted();
if ((gBattleTypeFlags & BATTLE_TYPE_LINK) && !(gBattleTypeFlags & BATTLE_TYPE_WILD))
gBattleBankFunc[gActiveBank] = sub_81595E4;
gBattlerControllerFuncs[gActiveBattler] = sub_81595E4;
}
static void nullsub_115(void)
File diff suppressed because it is too large Load Diff
+276 -300
View File
File diff suppressed because it is too large Load Diff
+6 -6
View File
@@ -4,7 +4,7 @@
#include "sprite.h"
#include "window.h"
#include "malloc.h"
#include "species.h"
#include "constants/species.h"
#include "palette.h"
#include "decompress.h"
#include "battle_dome_cards.h"
@@ -19,7 +19,7 @@ extern const union AffineAnimCmd *const gUnknown_082FF694[];
extern const union AnimCmd *const gUnknown_082FF70C[];
extern const union AnimCmd *const *const gMonAnimationsSpriteAnimsPtrTable[NUM_SPECIES];
extern const union AnimCmd *const *const gUnknown_0830536C[];
extern const u8 gUnknown_0831F578[];
extern const u8 gFacilityClassToPicIndex[];
// Static type declarations
@@ -119,7 +119,7 @@ static void sub_818D0C4(u16 species, u32 otId, u32 personality, u8 paletteSlot,
if (paletteTag == 0xFFFF)
{
gUnknown_0203CCEC.paletteTag |= 0xFFFF;
LoadCompressedPalette(species_and_otid_get_pal(species, otId, personality), 0x100 + paletteSlot * 0x10, 0x20);
LoadCompressedPalette(GetFrontSpritePalFromSpeciesAndPersonality(species, otId, personality), 0x100 + paletteSlot * 0x10, 0x20);
}
else
{
@@ -146,7 +146,7 @@ static void sub_818D180(u16 species, u32 otId, u32 personality, u8 paletteSlot,
{
if (!isTrainer)
{
LoadCompressedPalette(species_and_otid_get_pal(species, otId, personality), paletteSlot * 0x10, 0x20);
LoadCompressedPalette(GetFrontSpritePalFromSpeciesAndPersonality(species, otId, personality), paletteSlot * 0x10, 0x20);
}
else
{
@@ -421,9 +421,9 @@ u8 sub_818D97C(u8 a0, u8 a1)
switch (a0)
{
default:
return gUnknown_0831F578[0x3F];
return gFacilityClassToPicIndex[0x3F];
case 0:
return gUnknown_0831F578[0x3C];
return gFacilityClassToPicIndex[0x3C];
}
}
return a0;
File diff suppressed because it is too large Load Diff
+171 -179
View File
@@ -8,18 +8,19 @@
#include "string_util.h"
#include "text.h"
#include "sound.h"
#include "songs.h"
#include "constants/songs.h"
#include "decompress.h"
#include "task.h"
#include "util.h"
#include "gpu_regs.h"
#include "battle_message.h"
#include "species.h"
#include "constants/species.h"
#include "pokedex.h"
#include "palette.h"
#include "international_string_util.h"
#include "safari_zone.h"
#include "battle_anim.h"
#include "constants/rgb.h"
struct TestingBar
{
@@ -152,11 +153,6 @@ enum
HEALTHBOX_GFX_117,
};
extern u8 gBanksByIdentity[BATTLE_BANKS_COUNT];
extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
extern u8 gNoOfAllBanks;
extern u8 gHealthBoxesIds[BATTLE_BANKS_COUNT];
extern const u8 * const gNatureNamePointers[];
extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1];
@@ -176,10 +172,6 @@ extern const u16 gBattleInterface_BallStatusBarPal[];
extern const u16 gBattleInterface_BallDisplayPal[];
extern const u8 gHealthboxElementsGfxTable[][32];
// functions
extern void AddTextPrinterParametrized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, struct TextColor *color, s8 speed, const u8 *str); // menu.h
extern void LoadBattleBarGfx(u8 arg0);
// this file's functions
static const u8 *GetHealthboxElementGfxPtr(u8 elementId);
@@ -556,13 +548,13 @@ enum
PAL_STATUS_BRN
};
static const u16 sStatusIconPalettes[] =
static const u16 sStatusIconColors[] =
{
0x6198, // PAL_STATUS_PSN
0xEF7, // PAL_STATUS_PAR
0x4694, // PAL_STATUS_SLP
0x72D1, // PAL_STATUS_FRZ
0x29DC // PAL_STATUS_BRN
RGB(24, 12, 24), // PAL_STATUS_PSN
RGB(23, 23, 3), // PAL_STATUS_PAR
RGB(20, 20, 17), // PAL_STATUS_SLP
RGB(17, 22, 28), // PAL_STATUS_FRZ
RGB(28, 14, 10) // PAL_STATUS_BRN
};
static const struct WindowTemplate sHealthboxWindowTemplate = {0, 0, 0, 8, 2, 0, 0}; // width = 8, height = 2
@@ -898,7 +890,7 @@ void sub_80724A8(s16 arg0, s16 arg1, u16 *arg2)
// healthboxSpriteId_2 refers to the other part
// there's also one other sprite that appears to be a black square? dont fully understand its role
u8 CreateBankHealthboxSprites(u8 bank)
u8 CreateBattlerHealthboxSprites(u8 battler)
{
s16 data6 = 0;
u8 healthboxSpriteId_1, healthboxSpriteId_2;
@@ -907,7 +899,7 @@ u8 CreateBankHealthboxSprites(u8 bank)
if (!IsDoubleBattle())
{
if (GetBankSide(bank) == SIDE_PLAYER)
if (GetBattlerSide(battler) == B_SIDE_PLAYER)
{
healthboxSpriteId_1 = CreateSprite(&sHealthboxPlayerSpriteTemplates[0], 240, 160, 1);
healthboxSpriteId_2 = CreateSpriteAtEnd(&sHealthboxPlayerSpriteTemplates[0], 240, 160, 1);
@@ -927,19 +919,19 @@ u8 CreateBankHealthboxSprites(u8 bank)
data6 = 2;
}
gSprites[healthboxSpriteId_1].oam.affineParam = healthboxSpriteId_2;
gSprites[healthboxSpriteId_2].data5 = healthboxSpriteId_1;
gSprites[healthboxSpriteId_2].data[5] = healthboxSpriteId_1;
gSprites[healthboxSpriteId_2].callback = sub_8072924;
}
else
{
if (GetBankSide(bank) == SIDE_PLAYER)
if (GetBattlerSide(battler) == B_SIDE_PLAYER)
{
healthboxSpriteId_1 = CreateSprite(&sHealthboxPlayerSpriteTemplates[GetBankIdentity(bank) / 2], 240, 160, 1);
healthboxSpriteId_2 = CreateSpriteAtEnd(&sHealthboxPlayerSpriteTemplates[GetBankIdentity(bank) / 2], 240, 160, 1);
healthboxSpriteId_1 = CreateSprite(&sHealthboxPlayerSpriteTemplates[GetBattlerPosition(battler) / 2], 240, 160, 1);
healthboxSpriteId_2 = CreateSpriteAtEnd(&sHealthboxPlayerSpriteTemplates[GetBattlerPosition(battler) / 2], 240, 160, 1);
gSprites[healthboxSpriteId_1].oam.affineParam = healthboxSpriteId_2;
gSprites[healthboxSpriteId_2].data5 = healthboxSpriteId_1;
gSprites[healthboxSpriteId_2].data[5] = healthboxSpriteId_1;
gSprites[healthboxSpriteId_2].oam.tileNum += 32;
gSprites[healthboxSpriteId_2].callback = sub_8072924;
@@ -947,12 +939,12 @@ u8 CreateBankHealthboxSprites(u8 bank)
}
else
{
healthboxSpriteId_1 = CreateSprite(&sHealthboxOpponentSpriteTemplates[GetBankIdentity(bank) / 2], 240, 160, 1);
healthboxSpriteId_2 = CreateSpriteAtEnd(&sHealthboxOpponentSpriteTemplates[GetBankIdentity(bank) / 2], 240, 160, 1);
healthboxSpriteId_1 = CreateSprite(&sHealthboxOpponentSpriteTemplates[GetBattlerPosition(battler) / 2], 240, 160, 1);
healthboxSpriteId_2 = CreateSpriteAtEnd(&sHealthboxOpponentSpriteTemplates[GetBattlerPosition(battler) / 2], 240, 160, 1);
gSprites[healthboxSpriteId_1].oam.affineParam = healthboxSpriteId_2;
gSprites[healthboxSpriteId_2].data5 = healthboxSpriteId_1;
gSprites[healthboxSpriteId_2].data[5] = healthboxSpriteId_1;
gSprites[healthboxSpriteId_2].oam.tileNum += 32;
gSprites[healthboxSpriteId_2].callback = sub_8072924;
@@ -960,22 +952,22 @@ u8 CreateBankHealthboxSprites(u8 bank)
}
}
unkSpriteId = CreateSpriteAtEnd(&sUnknown_0832C1C0[gBanksByIdentity[bank]], 140, 60, 0);
unkSpriteId = CreateSpriteAtEnd(&sUnknown_0832C1C0[gBattlerPositions[battler]], 140, 60, 0);
unkSpritePtr = &gSprites[unkSpriteId];
SetSubspriteTables(unkSpritePtr, &sUnknown_0832C28C[GetBankSide(bank)]);
SetSubspriteTables(unkSpritePtr, &sUnknown_0832C28C[GetBattlerSide(battler)]);
unkSpritePtr->subspriteMode = 2;
unkSpritePtr->oam.priority = 1;
CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_1), (void*)(OBJ_VRAM0 + unkSpritePtr->oam.tileNum * 32), 64);
gSprites[healthboxSpriteId_1].data5 = unkSpriteId;
gSprites[healthboxSpriteId_1].data6 = bank;
gSprites[healthboxSpriteId_1].data[5] = unkSpriteId;
gSprites[healthboxSpriteId_1].data[6] = battler;
gSprites[healthboxSpriteId_1].invisible = 1;
gSprites[healthboxSpriteId_2].invisible = 1;
unkSpritePtr->data5 = healthboxSpriteId_1;
unkSpritePtr->data6 = data6;
unkSpritePtr->data[5] = healthboxSpriteId_1;
unkSpritePtr->data[6] = data6;
unkSpritePtr->invisible = 1;
return healthboxSpriteId_1;
@@ -994,7 +986,7 @@ u8 CreateSafariPlayerHealthboxSprites(void)
gSprites[healthboxSpriteId_2].oam.tileNum += 64;
gSprites[healthboxSpriteId_1].oam.affineParam = healthboxSpriteId_2;
gSprites[healthboxSpriteId_2].data5 = healthboxSpriteId_1;
gSprites[healthboxSpriteId_2].data[5] = healthboxSpriteId_1;
gSprites[healthboxSpriteId_2].callback = sub_8072924;
@@ -1008,9 +1000,9 @@ static const u8 *GetHealthboxElementGfxPtr(u8 elementId)
static void sub_80728B4(struct Sprite *sprite)
{
u8 var = sprite->data5;
u8 var = sprite->data[5];
switch (sprite->data6)
switch (sprite->data[6])
{
case 0:
sprite->pos1.x = gSprites[var].pos1.x + 16;
@@ -1033,7 +1025,7 @@ static void sub_80728B4(struct Sprite *sprite)
static void sub_8072924(struct Sprite *sprite)
{
u8 otherSpriteId = sprite->data5;
u8 otherSpriteId = sprite->data[5];
sprite->pos1.x = gSprites[otherSpriteId].pos1.x + 64;
sprite->pos1.y = gSprites[otherSpriteId].pos1.y;
@@ -1054,14 +1046,14 @@ void SetBattleBarStruct(u8 bank, u8 healthboxSpriteId, s32 maxVal, s32 currVal,
void SetHealthboxSpriteInvisible(u8 healthboxSpriteId)
{
gSprites[healthboxSpriteId].invisible = 1;
gSprites[gSprites[healthboxSpriteId].data5].invisible = 1;
gSprites[gSprites[healthboxSpriteId].data[5]].invisible = 1;
gSprites[gSprites[healthboxSpriteId].oam.affineParam].invisible = 1;
}
void SetHealthboxSpriteVisible(u8 healthboxSpriteId)
{
gSprites[healthboxSpriteId].invisible = 0;
gSprites[gSprites[healthboxSpriteId].data5].invisible = 0;
gSprites[gSprites[healthboxSpriteId].data[5]].invisible = 0;
gSprites[gSprites[healthboxSpriteId].oam.affineParam].invisible = 0;
}
@@ -1074,7 +1066,7 @@ static void UpdateSpritePos(u8 spriteId, s16 x, s16 y)
void DestoryHealthboxSprite(u8 healthboxSpriteId)
{
DestroySprite(&gSprites[gSprites[healthboxSpriteId].oam.affineParam]);
DestroySprite(&gSprites[gSprites[healthboxSpriteId].data5]);
DestroySprite(&gSprites[gSprites[healthboxSpriteId].data[5]]);
DestroySprite(&gSprites[healthboxSpriteId]);
}
@@ -1087,11 +1079,11 @@ void UpdateOamPriorityInAllHealthboxes(u8 priority)
{
s32 i;
for (i = 0; i < gNoOfAllBanks; i++)
for (i = 0; i < gBattlersCount; i++)
{
u8 healthboxSpriteId_1 = gHealthBoxesIds[i];
u8 healthboxSpriteId_2 = gSprites[gHealthBoxesIds[i]].oam.affineParam;
u8 healthboxSpriteId_3 = gSprites[gHealthBoxesIds[i]].data5;
u8 healthboxSpriteId_1 = gHealthboxSpriteIds[i];
u8 healthboxSpriteId_2 = gSprites[gHealthboxSpriteIds[i]].oam.affineParam;
u8 healthboxSpriteId_3 = gSprites[gHealthboxSpriteIds[i]].data[5];
gSprites[healthboxSpriteId_1].oam.priority = priority;
gSprites[healthboxSpriteId_2].oam.priority = priority;
@@ -1099,37 +1091,37 @@ void UpdateOamPriorityInAllHealthboxes(u8 priority)
}
}
void SetBankHealthboxSpritePos(u8 bank)
void InitBattlerHealthboxCoords(u8 battler)
{
s16 x = 0, y = 0;
if (!IsDoubleBattle())
{
if (GetBankSide(bank) != SIDE_PLAYER)
if (GetBattlerSide(battler) != B_SIDE_PLAYER)
x = 44, y = 30;
else
x = 158, y = 88;
}
else
{
switch (GetBankIdentity(bank))
switch (GetBattlerPosition(battler))
{
case IDENTITY_PLAYER_MON1:
case B_POSITION_PLAYER_LEFT:
x = 159, y = 76;
break;
case IDENTITY_PLAYER_MON2:
case B_POSITION_PLAYER_RIGHT:
x = 171, y = 101;
break;
case IDENTITY_OPPONENT_MON1:
case B_POSITION_OPPONENT_LEFT:
x = 44, y = 19;
break;
case IDENTITY_OPPONENT_MON2:
case B_POSITION_OPPONENT_RIGHT:
x = 32, y = 44;
break;
}
}
UpdateSpritePos(gHealthBoxesIds[bank], x, y);
UpdateSpritePos(gHealthboxSpriteIds[battler], x, y);
}
static void UpdateLvlInHealthbox(u8 healthboxSpriteId, u8 lvl)
@@ -1156,7 +1148,7 @@ static void UpdateLvlInHealthbox(u8 healthboxSpriteId, u8 lvl)
windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, xPos, 3, 2, &windowId);
spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32;
if (GetBankSide(gSprites[healthboxSpriteId].data6) == SIDE_PLAYER)
if (GetBattlerSide(gSprites[healthboxSpriteId].data[6]) == B_SIDE_PLAYER)
{
objVram = (void*)(OBJ_VRAM0);
if (!IsDoubleBattle())
@@ -1180,7 +1172,7 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent)
u8 text[32];
void *objVram;
if (GetBankSide(gSprites[healthboxSpriteId].data6) == SIDE_PLAYER && !IsDoubleBattle())
if (GetBattlerSide(gSprites[healthboxSpriteId].data[6]) == B_SIDE_PLAYER && !IsDoubleBattle())
{
spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32;
if (maxOrCurrent != HP_CURRENT) // singles, max
@@ -1210,11 +1202,11 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent)
}
else
{
u8 bank;
u8 battler;
memcpy(text, sUnknown_0832C3C4, sizeof(sUnknown_0832C3C4));
bank = gSprites[healthboxSpriteId].data6;
if (IsDoubleBattle() == TRUE || GetBankSide(bank) == SIDE_OPPONENT)
battler = gSprites[healthboxSpriteId].data[6];
if (IsDoubleBattle() == TRUE || GetBattlerSide(battler) == B_SIDE_OPPONENT)
{
UpdateHpTextInHealthboxInDoubles(healthboxSpriteId, value, maxOrCurrent);
}
@@ -1223,7 +1215,7 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent)
u32 var;
u8 i;
if (GetBankSide(gSprites[healthboxSpriteId].data6) == SIDE_PLAYER)
if (GetBattlerSide(gSprites[healthboxSpriteId].data[6]) == B_SIDE_PLAYER)
{
if (maxOrCurrent == HP_CURRENT)
var = 29;
@@ -1239,11 +1231,11 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent)
}
ConvertIntToDecimalStringN(text + 6, value, STR_CONV_MODE_RIGHT_ALIGN, 3);
RenderTextFont9(gMonSpritesGfxPtr->fontPixels, 9, text);
RenderTextFont9(gMonSpritesGfxPtr->barFontGfx, 9, text);
for (i = 0; i < 3; i++)
{
CpuCopy32(&gMonSpritesGfxPtr->fontPixels[i * 64 + 32],
CpuCopy32(&gMonSpritesGfxPtr->barFontGfx[i * 64 + 32],
(void*)((OBJ_VRAM0) + 32 * (gSprites[healthboxSpriteId].oam.tileNum + var + i)),
0x20);
}
@@ -1258,11 +1250,11 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8
u8 text[32];
void *objVram;
if (GetBankSide(gSprites[healthboxSpriteId].data6) == SIDE_PLAYER)
if (GetBattlerSide(gSprites[healthboxSpriteId].data[6]) == B_SIDE_PLAYER)
{
if (gBattleSpritesDataPtr->bankData[gSprites[healthboxSpriteId].data6].hpNumbersNoBars) // don't print text if only bars are visible
if (gBattleSpritesDataPtr->battlerData[gSprites[healthboxSpriteId].data[6]].hpNumbersNoBars) // don't print text if only bars are visible
{
spriteTileNum = gSprites[gSprites[healthboxSpriteId].data5].oam.tileNum * 32;
spriteTileNum = gSprites[gSprites[healthboxSpriteId].data[5]].oam.tileNum * 32;
objVram = (void*)(OBJ_VRAM0) + spriteTileNum;
if (maxOrCurrent != HP_CURRENT) // doubles, max hp
@@ -1292,9 +1284,9 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8
u8 bank;
memcpy(text, sUnknown_0832C3D8, sizeof(sUnknown_0832C3D8));
bank = gSprites[healthboxSpriteId].data6;
bank = gSprites[healthboxSpriteId].data[6];
if (gBattleSpritesDataPtr->bankData[bank].hpNumbersNoBars) // don't print text if only bars are visible
if (gBattleSpritesDataPtr->battlerData[bank].hpNumbersNoBars) // don't print text if only bars are visible
{
u8 var = 4;
u8 r7;
@@ -1304,23 +1296,23 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8
if (maxOrCurrent == HP_CURRENT)
var = 0;
r7 = gSprites[healthboxSpriteId].data5;
r7 = gSprites[healthboxSpriteId].data[5];
txtPtr = ConvertIntToDecimalStringN(text + 6, value, STR_CONV_MODE_RIGHT_ALIGN, 3);
if (!maxOrCurrent)
StringCopy(txtPtr, gText_Slash);
RenderTextFont9(gMonSpritesGfxPtr->fontPixels, 9, text);
RenderTextFont9(gMonSpritesGfxPtr->barFontGfx, 9, text);
for (i = var; i < var + 3; i++)
{
if (i < 3)
{
CpuCopy32(&gMonSpritesGfxPtr->fontPixels[((i - var) * 64) + 32],
CpuCopy32(&gMonSpritesGfxPtr->barFontGfx[((i - var) * 64) + 32],
(void*)((OBJ_VRAM0) + 32 * (1 + gSprites[r7].oam.tileNum + i)),
0x20);
}
else
{
CpuCopy32(&gMonSpritesGfxPtr->fontPixels[((i - var) * 64) + 32],
CpuCopy32(&gMonSpritesGfxPtr->barFontGfx[((i - var) * 64) + 32],
(void*)((OBJ_VRAM0 + 0x20) + 32 * (i + gSprites[r7].oam.tileNum)),
0x20);
}
@@ -1328,14 +1320,14 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8
if (maxOrCurrent == HP_CURRENT)
{
CpuCopy32(&gMonSpritesGfxPtr->fontPixels[224],
CpuCopy32(&gMonSpritesGfxPtr->barFontGfx[224],
(void*)((OBJ_VRAM0) + ((gSprites[r7].oam.tileNum + 4) * 32)),
0x20);
CpuFill32(0, (void*)((OBJ_VRAM0) + (gSprites[r7].oam.tileNum * 32)), 0x20);
}
else
{
if (GetBankSide(bank) == SIDE_PLAYER) // impossible to reach part, because the bank is from the opponent's side
if (GetBattlerSide(bank) == B_SIDE_PLAYER) // impossible to reach part, because the bank is from the opponent's side
{
CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_116),
(void*)(OBJ_VRAM0) + ((gSprites[healthboxSpriteId].oam.tileNum + 52) * 32),
@@ -1350,15 +1342,15 @@ static void sub_80730D4(u8 healthboxSpriteId, struct Pokemon *mon)
{
u8 text[20];
s32 j, var2;
u8 *fontPixels;
u8 *barFontGfx;
u8 i, var, nature, healthboxSpriteId_2;
memcpy(text, sUnknown_0832C3C4, sizeof(sUnknown_0832C3C4));
fontPixels = &gMonSpritesGfxPtr->fontPixels[0x520 + (GetBankIdentity(gSprites[healthboxSpriteId].data6) * 384)];
barFontGfx = &gMonSpritesGfxPtr->barFontGfx[0x520 + (GetBattlerPosition(gSprites[healthboxSpriteId].data[6]) * 384)];
var = 5;
nature = GetNature(mon);
StringCopy(text + 6, gNatureNamePointers[nature]);
RenderTextFont9(fontPixels, 9, text);
RenderTextFont9(barFontGfx, 9, text);
for (j = 6, i = 0; i < var; i++, j++)
{
@@ -1371,39 +1363,39 @@ static void sub_80730D4(u8 healthboxSpriteId, struct Pokemon *mon)
else
elementId = 43;
CpuCopy32(GetHealthboxElementGfxPtr(elementId), fontPixels + (i * 64), 0x20);
CpuCopy32(GetHealthboxElementGfxPtr(elementId), barFontGfx + (i * 64), 0x20);
}
for (j = 1; j < var + 1; j++)
{
var2 = (gSprites[healthboxSpriteId].oam.tileNum + (j - (j / 8 * 8)) + (j / 8 * 64)) * 32;
CpuCopy32(fontPixels, (void*)(OBJ_VRAM0) + (var2), 0x20);
fontPixels += 0x20;
CpuCopy32(barFontGfx, (void*)(OBJ_VRAM0) + (var2), 0x20);
barFontGfx += 0x20;
var2 = (8 + gSprites[healthboxSpriteId].oam.tileNum + (j - (j / 8 * 8)) + (j / 8 * 64)) * 32;
CpuCopy32(fontPixels, (void*)(OBJ_VRAM0) + (var2), 0x20);
fontPixels += 0x20;
CpuCopy32(barFontGfx, (void*)(OBJ_VRAM0) + (var2), 0x20);
barFontGfx += 0x20;
}
healthboxSpriteId_2 = gSprites[healthboxSpriteId].data5;
healthboxSpriteId_2 = gSprites[healthboxSpriteId].data[5];
ConvertIntToDecimalStringN(text + 6, gBattleStruct->field_7C, STR_CONV_MODE_RIGHT_ALIGN, 2);
ConvertIntToDecimalStringN(text + 9, gBattleStruct->field_7B, STR_CONV_MODE_RIGHT_ALIGN, 2);
text[5] = CHAR_SPACE;
text[8] = CHAR_SLASH;
RenderTextFont9(gMonSpritesGfxPtr->fontPixels, 9, text);
RenderTextFont9(gMonSpritesGfxPtr->barFontGfx, 9, text);
j = healthboxSpriteId_2; // needed to match for some reason
for (j = 0; j < 5; j++)
{
if (j <= 1)
{
CpuCopy32(&gMonSpritesGfxPtr->fontPixels[0x40 * j + 0x20],
CpuCopy32(&gMonSpritesGfxPtr->barFontGfx[0x40 * j + 0x20],
(void*)(OBJ_VRAM0) + (gSprites[healthboxSpriteId_2].oam.tileNum + 2 + j) * 32,
32);
}
else
{
CpuCopy32(&gMonSpritesGfxPtr->fontPixels[0x40 * j + 0x20],
CpuCopy32(&gMonSpritesGfxPtr->barFontGfx[0x40 * j + 0x20],
(void*)(OBJ_VRAM0 + 0xC0) + (j + gSprites[healthboxSpriteId_2].oam.tileNum) * 32,
32);
}
@@ -1415,17 +1407,17 @@ void SwapHpBarsWithHpText(void)
s32 i;
u8 spriteId;
for (i = 0; i < gNoOfAllBanks; i++)
for (i = 0; i < gBattlersCount; i++)
{
if (gSprites[gHealthBoxesIds[i]].callback == SpriteCallbackDummy
&& GetBankSide(i) != SIDE_OPPONENT
&& (IsDoubleBattle() || GetBankSide(i) != SIDE_PLAYER))
if (gSprites[gHealthboxSpriteIds[i]].callback == SpriteCallbackDummy
&& GetBattlerSide(i) != B_SIDE_OPPONENT
&& (IsDoubleBattle() || GetBattlerSide(i) != B_SIDE_PLAYER))
{
bool8 noBars;
gBattleSpritesDataPtr->bankData[i].hpNumbersNoBars ^= 1;
noBars = gBattleSpritesDataPtr->bankData[i].hpNumbersNoBars;
if (GetBankSide(i) == SIDE_PLAYER)
gBattleSpritesDataPtr->battlerData[i].hpNumbersNoBars ^= 1;
noBars = gBattleSpritesDataPtr->battlerData[i].hpNumbersNoBars;
if (GetBattlerSide(i) == B_SIDE_PLAYER)
{
if (!IsDoubleBattle())
continue;
@@ -1434,17 +1426,17 @@ void SwapHpBarsWithHpText(void)
if (noBars == TRUE) // bars to text
{
spriteId = gSprites[gHealthBoxesIds[i]].data5;
spriteId = gSprites[gHealthboxSpriteIds[i]].data[5];
CpuFill32(0, (void*)(OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * 32), 0x100);
UpdateHpTextInHealthboxInDoubles(gHealthBoxesIds[i], GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_HP), HP_CURRENT);
UpdateHpTextInHealthboxInDoubles(gHealthBoxesIds[i], GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_MAX_HP), HP_MAX);
UpdateHpTextInHealthboxInDoubles(gHealthboxSpriteIds[i], GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_HP), HP_CURRENT);
UpdateHpTextInHealthboxInDoubles(gHealthboxSpriteIds[i], GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_MAX_HP), HP_MAX);
}
else // text to bars
{
UpdateStatusIconInHealthbox(gHealthBoxesIds[i]);
UpdateHealthboxAttribute(gHealthBoxesIds[i], &gPlayerParty[gBattlePartyID[i]], HEALTHBOX_HEALTH_BAR);
CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_117), (void*)(OBJ_VRAM0 + 0x680 + gSprites[gHealthBoxesIds[i]].oam.tileNum * 32), 32);
UpdateStatusIconInHealthbox(gHealthboxSpriteIds[i]);
UpdateHealthboxAttribute(gHealthboxSpriteIds[i], &gPlayerParty[gBattlerPartyIndexes[i]], HEALTHBOX_HEALTH_BAR);
CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_117), (void*)(OBJ_VRAM0 + 0x680 + gSprites[gHealthboxSpriteIds[i]].oam.tileNum * 32), 32);
}
}
else
@@ -1453,26 +1445,26 @@ void SwapHpBarsWithHpText(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
{
sub_80730D4(gHealthBoxesIds[i], &gEnemyParty[gBattlePartyID[i]]);
sub_80730D4(gHealthboxSpriteIds[i], &gEnemyParty[gBattlerPartyIndexes[i]]);
}
else
{
spriteId = gSprites[gHealthBoxesIds[i]].data5;
spriteId = gSprites[gHealthboxSpriteIds[i]].data[5];
CpuFill32(0, (void *)(OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * 32), 0x100);
UpdateHpTextInHealthboxInDoubles(gHealthBoxesIds[i], GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_HP), HP_CURRENT);
UpdateHpTextInHealthboxInDoubles(gHealthBoxesIds[i], GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_MAX_HP), HP_MAX);
UpdateHpTextInHealthboxInDoubles(gHealthboxSpriteIds[i], GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_HP), HP_CURRENT);
UpdateHpTextInHealthboxInDoubles(gHealthboxSpriteIds[i], GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_MAX_HP), HP_MAX);
}
}
else // text to bars
{
UpdateStatusIconInHealthbox(gHealthBoxesIds[i]);
UpdateHealthboxAttribute(gHealthBoxesIds[i], &gEnemyParty[gBattlePartyID[i]], HEALTHBOX_HEALTH_BAR);
UpdateStatusIconInHealthbox(gHealthboxSpriteIds[i]);
UpdateHealthboxAttribute(gHealthboxSpriteIds[i], &gEnemyParty[gBattlerPartyIndexes[i]], HEALTHBOX_HEALTH_BAR);
if (gBattleTypeFlags & BATTLE_TYPE_SAFARI)
UpdateHealthboxAttribute(gHealthBoxesIds[i], &gEnemyParty[gBattlePartyID[i]], HEALTHBOX_NICK);
UpdateHealthboxAttribute(gHealthboxSpriteIds[i], &gEnemyParty[gBattlerPartyIndexes[i]], HEALTHBOX_NICK);
}
}
gSprites[gHealthBoxesIds[i]].data7 ^= 1;
gSprites[gHealthboxSpriteIds[i]].data[7] ^= 1;
}
}
}
@@ -1486,9 +1478,9 @@ u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 ar
u8 ballIconSpritesIds[6];
u8 taskId;
if (!arg2 || GetBankIdentity(bank) != IDENTITY_OPPONENT_MON2)
if (!arg2 || GetBattlerPosition(bank) != B_POSITION_OPPONENT_RIGHT)
{
if (GetBankSide(bank) == SIDE_PLAYER)
if (GetBattlerSide(bank) == B_SIDE_PLAYER)
{
isOpponent = FALSE;
bar_X = 136, bar_Y = 96;
@@ -1524,7 +1516,7 @@ u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 ar
barSpriteId = CreateSprite(&sStatusSummaryBarSpriteTemplates[isOpponent], bar_X, bar_Y, 10);
SetSubspriteTables(&gSprites[barSpriteId], sStatusSummaryBar_SubspriteTable);
gSprites[barSpriteId].pos2.x = bar_pos2_X;
gSprites[barSpriteId].data0 = bar_data0;
gSprites[barSpriteId].data[0] = bar_data0;
if (isOpponent)
{
@@ -1536,7 +1528,7 @@ u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 ar
gSprites[barSpriteId].pos1.x += 96;
}
for (i = 0; i < 6; i++)
for (i = 0; i < PARTY_SIZE; i++)
{
ballIconSpritesIds[i] = CreateSpriteAtEnd(&sStatusSummaryBallsSpriteTemplates[isOpponent], bar_X, bar_Y - 4, 9);
@@ -1549,25 +1541,25 @@ u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 ar
gSprites[ballIconSpritesIds[i]].pos2.y = 0;
}
gSprites[ballIconSpritesIds[i]].data0 = barSpriteId;
gSprites[ballIconSpritesIds[i]].data[0] = barSpriteId;
if (!isOpponent)
{
gSprites[ballIconSpritesIds[i]].pos1.x += 10 * i + 24;
gSprites[ballIconSpritesIds[i]].data1 = i * 7 + 10;
gSprites[ballIconSpritesIds[i]].data[1] = i * 7 + 10;
gSprites[ballIconSpritesIds[i]].pos2.x = 120;
}
else
{
gSprites[ballIconSpritesIds[i]].pos1.x -= 10 * (5 - i) + 24;
gSprites[ballIconSpritesIds[i]].data1 = (6 - i) * 7 + 10;
gSprites[ballIconSpritesIds[i]].data[1] = (6 - i) * 7 + 10;
gSprites[ballIconSpritesIds[i]].pos2.x = -120;
}
gSprites[ballIconSpritesIds[i]].data2 = isOpponent;
gSprites[ballIconSpritesIds[i]].data[2] = isOpponent;
}
if (GetBankSide(bank) == SIDE_PLAYER)
if (GetBattlerSide(bank) == B_SIDE_PLAYER)
{
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
@@ -1576,7 +1568,7 @@ u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 ar
if (partyInfo[i].hp == 0xFFFF) // empty slot or an egg
{
gSprites[ballIconSpritesIds[i]].oam.tileNum += 1;
gSprites[ballIconSpritesIds[i]].data7 = 1;
gSprites[ballIconSpritesIds[i]].data[7] = 1;
}
else if (partyInfo[i].hp == 0) // fainted mon
{
@@ -1595,7 +1587,7 @@ u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 ar
if (partyInfo[j].hp == 0xFFFF) // empty slot or an egg
{
gSprites[ballIconSpritesIds[var]].oam.tileNum += 1;
gSprites[ballIconSpritesIds[var]].data7 = 1;
gSprites[ballIconSpritesIds[var]].data[7] = 1;
var--;
continue;
}
@@ -1624,7 +1616,7 @@ u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 ar
if (partyInfo[i].hp == 0xFFFF) // empty slot or an egg
{
gSprites[ballIconSpritesIds[var]].oam.tileNum += 1;
gSprites[ballIconSpritesIds[var]].data7 = 1;
gSprites[ballIconSpritesIds[var]].data[7] = 1;
}
else if (partyInfo[i].hp == 0) // fainted mon
{
@@ -1644,7 +1636,7 @@ u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 ar
if (partyInfo[j].hp == 0xFFFF) // empty slot or an egg
{
gSprites[ballIconSpritesIds[i]].oam.tileNum += 1;
gSprites[ballIconSpritesIds[i]].data7 = 1;
gSprites[ballIconSpritesIds[i]].data[7] = 1;
i++;
continue;
}
@@ -1712,23 +1704,23 @@ void sub_8073C30(u8 taskId)
{
for (i = 0; i < 6; i++)
{
if (GetBankSide(bank) != SIDE_PLAYER)
if (GetBattlerSide(bank) != B_SIDE_PLAYER)
{
gSprites[sp[5 - i]].data1 = 7 * i;
gSprites[sp[5 - i]].data3 = 0;
gSprites[sp[5 - i]].data4 = 0;
gSprites[sp[5 - i]].data[1] = 7 * i;
gSprites[sp[5 - i]].data[3] = 0;
gSprites[sp[5 - i]].data[4] = 0;
gSprites[sp[5 - i]].callback = sub_8074158;
}
else
{
gSprites[sp[i]].data1 = 7 * i;
gSprites[sp[i]].data3 = 0;
gSprites[sp[i]].data4 = 0;
gSprites[sp[i]].data[1] = 7 * i;
gSprites[sp[i]].data[3] = 0;
gSprites[sp[i]].data[4] = 0;
gSprites[sp[i]].callback = sub_8074158;
}
}
gSprites[r10].data0 /= 2;
gSprites[r10].data1 = 0;
gSprites[r10].data[0] /= 2;
gSprites[r10].data[1] = 0;
gSprites[r10].callback = sub_8074090;
SetSubspriteTables(&gSprites[r10], sUnknown_0832C2CC);
gTasks[taskId].func = sub_8073E08;
@@ -1831,17 +1823,17 @@ static void sub_8073F98(u8 taskId)
static void SpriteCB_StatusSummaryBar(struct Sprite *sprite)
{
if (sprite->pos2.x != 0)
sprite->pos2.x += sprite->data0;
sprite->pos2.x += sprite->data[0];
}
static void sub_8074090(struct Sprite *sprite)
{
sprite->data1 += 32;
if (sprite->data0 > 0)
sprite->pos2.x += sprite->data1 >> 4;
sprite->data[1] += 32;
if (sprite->data[0] > 0)
sprite->pos2.x += sprite->data[1] >> 4;
else
sprite->pos2.x -= sprite->data1 >> 4;
sprite->data1 &= 0xF;
sprite->pos2.x -= sprite->data[1] >> 4;
sprite->data[1] &= 0xF;
}
static void SpriteCB_StatusSummaryBallsOnBattleStart(struct Sprite *sprite)
@@ -1850,16 +1842,16 @@ static void SpriteCB_StatusSummaryBallsOnBattleStart(struct Sprite *sprite)
u16 var2;
s8 pan;
if (sprite->data1 > 0)
if (sprite->data[1] > 0)
{
sprite->data1--;
sprite->data[1]--;
return;
}
var1 = sprite->data2;
var2 = sprite->data3;
var1 = sprite->data[2];
var2 = sprite->data[3];
var2 += 56;
sprite->data3 = var2 & 0xFFF0;
sprite->data[3] = var2 & 0xFFF0;
if (var1 != 0)
{
@@ -1880,7 +1872,7 @@ static void SpriteCB_StatusSummaryBallsOnBattleStart(struct Sprite *sprite)
if (var1 != 0)
pan = PAN_SIDE_PLAYER;
if (sprite->data7 != 0)
if (sprite->data[7] != 0)
PlaySE2WithPanning(SE_TB_KARA, pan);
else
PlaySE1WithPanning(SE_TB_KON, pan);
@@ -1894,15 +1886,15 @@ static void sub_8074158(struct Sprite *sprite)
u8 var1;
u16 var2;
if (sprite->data1 > 0)
if (sprite->data[1] > 0)
{
sprite->data1--;
sprite->data[1]--;
return;
}
var1 = sprite->data2;
var2 = sprite->data3;
var1 = sprite->data[2];
var2 = sprite->data[3];
var2 += 56;
sprite->data3 = var2 & 0xFFF0;
sprite->data[3] = var2 & 0xFFF0;
if (var1 != 0)
sprite->pos2.x += var2 >> 4;
else
@@ -1917,7 +1909,7 @@ static void sub_8074158(struct Sprite *sprite)
static void SpriteCB_StatusSummaryBallsOnSwitchout(struct Sprite *sprite)
{
u8 barSpriteId = sprite->data0;
u8 barSpriteId = sprite->data[0];
sprite->pos2.x = gSprites[barSpriteId].pos2.x;
sprite->pos2.y = gSprites[barSpriteId].pos2.y;
@@ -1964,7 +1956,7 @@ static void UpdateNickInHealthbox(u8 healthboxSpriteId, struct Pokemon *mon)
spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32;
if (GetBankSide(gSprites[healthboxSpriteId].data6) == SIDE_PLAYER)
if (GetBattlerSide(gSprites[healthboxSpriteId].data[6]) == B_SIDE_PLAYER)
{
sub_8075198((void*)(0x6010040 + spriteTileNum), windowTileData, 6);
ptr = (void*)(OBJ_VRAM0);
@@ -1991,13 +1983,13 @@ static void TryAddPokeballIconToHealthbox(u8 healthboxSpriteId, bool8 noStatus)
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
return;
bank = gSprites[healthboxSpriteId].data6;
if (GetBankSide(bank) == SIDE_PLAYER)
bank = gSprites[healthboxSpriteId].data[6];
if (GetBattlerSide(bank) == B_SIDE_PLAYER)
return;
if (!GetSetPokedexFlag(SpeciesToNationalPokedexNum(GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES)), FLAG_GET_CAUGHT))
if (!GetSetPokedexFlag(SpeciesToNationalPokedexNum(GetMonData(&gEnemyParty[gBattlerPartyIndexes[bank]], MON_DATA_SPECIES)), FLAG_GET_CAUGHT))
return;
healthboxSpriteId_2 = gSprites[healthboxSpriteId].data5;
healthboxSpriteId_2 = gSprites[healthboxSpriteId].data[5];
if (noStatus)
CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_70), (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId_2].oam.tileNum + 8) * 32), 32);
@@ -2014,11 +2006,11 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId)
s16 tileNumAdder;
u8 statusPalId;
bank = gSprites[healthboxSpriteId].data6;
healthboxSpriteId_2 = gSprites[healthboxSpriteId].data5;
if (GetBankSide(bank) == SIDE_PLAYER)
bank = gSprites[healthboxSpriteId].data[6];
healthboxSpriteId_2 = gSprites[healthboxSpriteId].data[5];
if (GetBattlerSide(bank) == B_SIDE_PLAYER)
{
status = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_STATUS);
status = GetMonData(&gPlayerParty[gBattlerPartyIndexes[bank]], MON_DATA_STATUS);
if (!IsDoubleBattle())
tileNumAdder = 0x1A;
else
@@ -2026,31 +2018,31 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId)
}
else
{
status = GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_STATUS);
status = GetMonData(&gEnemyParty[gBattlerPartyIndexes[bank]], MON_DATA_STATUS);
tileNumAdder = 0x11;
}
if (status & STATUS_SLEEP)
if (status & STATUS1_SLEEP)
{
statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(HEALTHBOX_GFX_STATUS_SLP_BANK0, bank));
statusPalId = PAL_STATUS_SLP;
}
else if (status & STATUS_PSN_ANY)
else if (status & STATUS1_PSN_ANY)
{
statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(HEALTHBOX_GFX_STATUS_PSN_BANK0, bank));
statusPalId = PAL_STATUS_PSN;
}
else if (status & STATUS_BURN)
else if (status & STATUS1_BURN)
{
statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(HEALTHBOX_GFX_STATUS_BRN_BANK0, bank));
statusPalId = PAL_STATUS_BRN;
}
else if (status & STATUS_FREEZE)
else if (status & STATUS1_FREEZE)
{
statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(HEALTHBOX_GFX_STATUS_FRZ_BANK0, bank));
statusPalId = PAL_STATUS_FRZ;
}
else if (status & STATUS_PARALYSIS)
else if (status & STATUS1_PARALYSIS)
{
statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(HEALTHBOX_GFX_STATUS_PRZ_BANK0, bank));
statusPalId = PAL_STATUS_PAR;
@@ -2062,7 +2054,7 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId)
for (i = 0; i < 3; i++)
CpuCopy32(statusGfxPtr, (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId].oam.tileNum + tileNumAdder + i) * 32), 32);
if (!gBattleSpritesDataPtr->bankData[bank].hpNumbersNoBars)
if (!gBattleSpritesDataPtr->battlerData[bank].hpNumbersNoBars)
CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_1), (void *)(OBJ_VRAM0 + gSprites[healthboxSpriteId_2].oam.tileNum * 32), 64);
TryAddPokeballIconToHealthbox(healthboxSpriteId, TRUE);
@@ -2072,12 +2064,12 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId)
pltAdder = gSprites[healthboxSpriteId].oam.paletteNum * 16;
pltAdder += bank + 12;
FillPalette(sStatusIconPalettes[statusPalId], pltAdder + 0x100, 2);
FillPalette(sStatusIconColors[statusPalId], pltAdder + 0x100, 2);
CpuCopy16(gPlttBufferUnfaded + 0x100 + pltAdder, (void*)(OBJ_PLTT + pltAdder * 2), 2);
CpuCopy32(statusGfxPtr, (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId].oam.tileNum + tileNumAdder) * 32), 96);
if (IsDoubleBattle() == TRUE || GetBankSide(bank) == SIDE_OPPONENT)
if (IsDoubleBattle() == TRUE || GetBattlerSide(bank) == B_SIDE_OPPONENT)
{
if (!gBattleSpritesDataPtr->bankData[bank].hpNumbersNoBars)
if (!gBattleSpritesDataPtr->battlerData[bank].hpNumbersNoBars)
{
CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_0), (void*)(OBJ_VRAM0 + gSprites[healthboxSpriteId_2].oam.tileNum * 32), 32);
CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_65), (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId_2].oam.tileNum + 1) * 32), 32);
@@ -2178,12 +2170,12 @@ static void UpdateLeftNoOfBallsTextOnHealthbox(u8 healthboxSpriteId)
void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elementId)
{
s32 maxHp, currHp;
u8 bank = gSprites[healthboxSpriteId].data6;
u8 bank = gSprites[healthboxSpriteId].data[6];
if (elementId == HEALTHBOX_ALL && !IsDoubleBattle())
GetBankSide(bank); // pointless function call
GetBattlerSide(bank); // pointless function call
if (GetBankSide(gSprites[healthboxSpriteId].data6) == SIDE_PLAYER)
if (GetBattlerSide(gSprites[healthboxSpriteId].data[6]) == B_SIDE_PLAYER)
{
u8 isDoubles;
@@ -2275,7 +2267,7 @@ s32 sub_8074AA0(u8 bank, u8 healthboxSpriteId, u8 whichBar, u8 arg3)
8, expFraction);
}
if (whichBar == EXP_BAR || (whichBar == HEALTH_BAR && !gBattleSpritesDataPtr->bankData[bank].hpNumbersNoBars))
if (whichBar == EXP_BAR || (whichBar == HEALTH_BAR && !gBattleSpritesDataPtr->battlerData[bank].hpNumbersNoBars))
sub_8074B9C(bank, whichBar);
if (var == -1)
@@ -2308,7 +2300,7 @@ static void sub_8074B9C(u8 bank, u8 whichBar)
}
for (i = 0; i < 6; i++)
{
u8 healthboxSpriteId_2 = gSprites[gBattleSpritesDataPtr->battleBars[bank].healthboxSpriteId].data5;
u8 healthboxSpriteId_2 = gSprites[gBattleSpritesDataPtr->battleBars[bank].healthboxSpriteId].data[5];
if (i < 2)
CpuCopy32(GetHealthboxElementGfxPtr(barElementId) + array[i] * 32,
(void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId_2].oam.tileNum + 2 + i) * 32), 32);
@@ -2323,7 +2315,7 @@ static void sub_8074B9C(u8 bank, u8 whichBar)
gBattleSpritesDataPtr->battleBars[bank].receivedValue,
&gBattleSpritesDataPtr->battleBars[bank].field_10,
array, 8);
level = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_LEVEL);
level = GetMonData(&gPlayerParty[gBattlerPartyIndexes[bank]], MON_DATA_LEVEL);
if (level == MAX_MON_LEVEL)
{
for (i = 0; i < 8; i++)
@@ -2545,19 +2537,19 @@ u8 GetHPBarLevel(s16 hp, s16 maxhp)
if (hp == maxhp)
{
result = 4;
result = HP_BAR_FULL;
}
else
{
u8 fraction = GetScaledHPFraction(hp, maxhp, 48);
if (fraction > 24)
result = 3;
result = HP_BAR_GREEN;
else if (fraction > 9)
result = 2;
result = HP_BAR_YELLOW;
else if (fraction > 0)
result = 1;
result = HP_BAR_RED;
else
result = 0;
result = HP_BAR_EMPTY;
}
return result;
@@ -2566,17 +2558,17 @@ u8 GetHPBarLevel(s16 hp, s16 maxhp)
static u8* AddTextPrinterAndCreateWindowOnHealthbox(const u8 *str, u32 x, u32 y, u32 arg3, u32 *windowId)
{
u16 winId;
struct TextColor color;
u8 color[3];
struct WindowTemplate winTemplate = sHealthboxWindowTemplate;
winId = AddWindow(&winTemplate);
FillWindowPixelBuffer(winId, (arg3 << 4) | (arg3));
color.fgColor = arg3;
color.bgColor = 1;
color.shadowColor = 3;
color[0] = arg3;
color[1] = 1;
color[2] = 3;
AddTextPrinterParametrized2(winId, 0, x, y, 0, 0, &color, -1, str);
AddTextPrinterParameterized2(winId, 0, x, y, 0, 0, color, -1, str);
*windowId = winId;
return (u8*)(GetWindowAttribute(winId, WINDOW_TILE_DATA));
File diff suppressed because it is too large Load Diff
+353 -165
View File
@@ -1,34 +1,23 @@
#include "global.h"
#include "battle.h"
#include "battle_message.h"
#include "battle_string_ids.h"
#include "moves.h"
#include "constants/battle_string_ids.h"
#include "constants/moves.h"
#include "text.h"
#include "string_util.h"
#include "items.h"
#include "constants/items.h"
#include "event_data.h"
#include "link.h"
#include "item.h"
#include "window.h"
#include "palette.h"
#include "battle_controllers.h"
#include "battle_setup.h"
#include "menu.h"
#include "recorded_battle.h"
#include "international_string_util.h"
extern u16 gLastUsedItem;
extern u8 gLastUsedAbility;
extern u8 gActiveBank;
extern u8 gBankAttacker;
extern u8 gBankTarget;
extern u8 gStringBank;
extern u8 gEffectBank;
extern u8 gAbilitiesPerBank[BATTLE_BANKS_COUNT];
extern u32 gBattleTypeFlags;
extern u16 gTrainerBattleOpponent_A;
extern u16 gTrainerBattleOpponent_B;
extern u16 gPartnerTrainerId;
extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
extern struct BattleEnigmaBerry gEnigmaBerries[BATTLE_BANKS_COUNT];
extern u8 gBattleBufferA[BATTLE_BANKS_COUNT][0x200];
extern u8 gMoveSelectionCursor[BATTLE_BANKS_COUNT];
extern u8 gBattlerAbilities[MAX_BATTLERS_COUNT];
extern u8 gUnknown_0203C7B4;
extern struct StringInfoBattle *gStringInfo;
@@ -54,12 +43,7 @@ extern void sub_81D5554(u8 *txtPtr, u16 trainerId); // pokenav
extern void GetEreaderTrainerName(u8 *txtPtr);
extern void sub_81A36D0(u8 arg0, u16 trainerId); // battle_frontier_2
extern void sub_81D572C(u8 arg0, u16 trainerId); // pokenav
extern const u8* GetTrainer1LoseText(void); // battle_setup
extern const u8* GetTrainer2LoseText(void); // battle_setup
extern void GetFrontierTrainerName(u8 *dst, u16 trainerId);
extern s32 GetStringCenterAlignXOffsetWithLetterSpacing(u8 fontId, const u8 *str, s32 totalWidth, s16 letterSpacing);
extern u8 sub_8185FC4(void);
extern u8 sav2_get_text_speed(void);
// this file's functions
static void sub_814F8F8(u8 *textPtr);
@@ -485,8 +469,8 @@ const u8 gText_PkmnBrokeFree[] = _("Oh, no!\nThe POKéMON broke free!");
const u8 gText_ItAppearedCaught[] = _("Aww!\nIt appeared to be caught!");
const u8 gText_AarghAlmostHadIt[] = _("Aargh!\nAlmost had it!");
const u8 gText_ShootSoClose[] = _("Shoot!\nIt was so close, too!");
const u8 gText_GotchaPkmnCaught[] = _("Gotcha!\n{B_OPPONENT_MON1_NAME} was caught!{UNKNOWN_A}{PLAY_BGM BGM_KACHI22}\p");
const u8 gText_GotchaPkmnCaught2[] = _("Gotcha!\n{B_OPPONENT_MON1_NAME} was caught!{UNKNOWN_A}{PLAY_BGM BGM_KACHI22}{PAUSE 127}");
const u8 gText_GotchaPkmnCaught[] = _("Gotcha!\n{B_OPPONENT_MON1_NAME} was caught!{UNKNOWN_A}{PLAY_BGM MUS_KACHI22}\p");
const u8 gText_GotchaPkmnCaught2[] = _("Gotcha!\n{B_OPPONENT_MON1_NAME} was caught!{UNKNOWN_A}{PLAY_BGM MUS_KACHI22}{PAUSE 127}");
const u8 gText_GiveNicknameCaptured[] = _("Give a nickname to the\ncaptured {B_OPPONENT_MON1_NAME}?");
const u8 gText_PkmnSentToPC[] = _("{B_OPPONENT_MON1_NAME} was sent to\n{B_PC_CREATOR_NAME} PC.");
const u8 gText_Someones[] = _("someones");
@@ -932,58 +916,237 @@ const u16 gSandStormHailDmgStringIds[] =
STRINGID_PKMNBUFFETEDBYSANDSTORM, STRINGID_PKMNPELTEDBYHAIL
};
// todo once battlescripts are dumped
const u16 gTooLazyToSplitThemStringIds[] =
const u16 gSandStormHailEndStringIds[] =
{
STRINGID_SANDSTORMSUBSIDED, STRINGID_HAILSTOPPED, STRINGID_RAINCONTINUES, STRINGID_DOWNPOURCONTINUES,
STRINGID_RAINSTOPPED, STRINGID_PKMNPROTECTEDITSELF2, STRINGID_PKMNBRACEDITSELF,
STRINGID_BUTITFAILED, STRINGID_BUTITFAILED, STRINGID_PKMNRAISEDDEF,
STRINGID_PKMNRAISEDDEFALITTLE, STRINGID_PKMNRAISEDSPDEF, STRINGID_PKMNRAISEDSPDEFALITTLE,
STRINGID_PKMNCOVEREDBYVEIL, STRINGID_PKMNSEEDED, STRINGID_PKMNEVADEDATTACK,
STRINGID_SANDSTORMSUBSIDED, STRINGID_HAILSTOPPED
};
const u16 gRainContinuesStringIds[] =
{
STRINGID_RAINCONTINUES, STRINGID_DOWNPOURCONTINUES, STRINGID_RAINSTOPPED
};
const u16 gProtectLikeUsedStringIds[] =
{
STRINGID_PKMNPROTECTEDITSELF2, STRINGID_PKMNBRACEDITSELF, STRINGID_BUTITFAILED
};
const u16 gReflectLightScreenSafeguardStringIds[] =
{
STRINGID_BUTITFAILED, STRINGID_PKMNRAISEDDEF, STRINGID_PKMNRAISEDDEFALITTLE,
STRINGID_PKMNRAISEDSPDEF, STRINGID_PKMNRAISEDSPDEFALITTLE, STRINGID_PKMNCOVEREDBYVEIL
};
const u16 gLeechSeedStringIds[] =
{
STRINGID_PKMNSEEDED, STRINGID_PKMNEVADEDATTACK,
STRINGID_ITDOESNTAFFECT, STRINGID_PKMNSAPPEDBYLEECHSEED, STRINGID_ITSUCKEDLIQUIDOOZE,
STRINGID_PKMNWENTTOSLEEP, STRINGID_PKMNSLEPTHEALTHY, STRINGID_PKMNMAKINGUPROAR,
STRINGID_PKMNCALMEDDOWN, STRINGID_PKMNSTOCKPILED, STRINGID_PKMNCANTSTOCKPILE,
STRINGID_PKMNWOKEUP, STRINGID_PKMNWOKEUPINUPROAR, STRINGID_FAILEDTOSWALLOW,
STRINGID_PKMNHPFULL, STRINGID_PKMNCANTSLEEPINUPROAR2, STRINGID_UPROARKEPTPKMNAWAKE,
STRINGID_PKMNSTAYEDAWAKEUSING, STRINGID_PKMNSSTATCHANGED, STRINGID_PKMNSSTATCHANGED2,
STRINGID_STATSWONTINCREASE, STRINGID_EMPTYSTRING3, STRINGID_USINGXTHEYOFZN,
STRINGID_PKMNUSEDXTOGETPUMPED, STRINGID_PKMNSSTATCHANGED3, STRINGID_PKMNSSTATCHANGED4,
STRINGID_STATSWONTDECREASE, STRINGID_EMPTYSTRING3, STRINGID_PKMNWHIPPEDWHIRLWIND,
STRINGID_PKMNTOOKSUNLIGHT, STRINGID_PKMNLOWEREDHEAD, STRINGID_PKMNISGLOWING,
STRINGID_PKMNFLEWHIGH, STRINGID_PKMNDUGHOLE, STRINGID_PKMNHIDUNDERWATER,
STRINGID_PKMNSPRANGUP, STRINGID_PKMNSQUEEZEDBYBIND, STRINGID_PKMNWRAPPEDBY,
STRINGID_PKMNTRAPPEDINVORTEX, STRINGID_PKMNCLAMPED, STRINGID_PKMNTRAPPEDINVORTEX,
STRINGID_PKMNTRAPPEDBYSANDTOMB, STRINGID_PKMNSHROUDEDINMIST, STRINGID_BUTITFAILED,
STRINGID_PKMNGETTINGPUMPED, STRINGID_BUTITFAILED, STRINGID_PKMNTRANSFORMEDINTO,
STRINGID_BUTITFAILED, STRINGID_PKMNMADESUBSTITUTE, STRINGID_TOOWEAKFORSUBSTITUTE,
STRINGID_PKMNWASPOISONED, STRINGID_PKMNPOISONEDBY, STRINGID_PKMNWASPARALYZED,
STRINGID_PKMNWASPARALYZEDBY, STRINGID_PKMNFELLASLEEP, STRINGID_PKMNMADESLEEP,
STRINGID_PKMNWASBURNED, STRINGID_PKMNBURNEDBY, STRINGID_PKMNWASFROZEN,
STRINGID_PKMNFROZENBY, STRINGID_PKMNWASDEFROSTED2, STRINGID_PKMNWASDEFROSTEDBY,
STRINGID_ATTACKMISSED, STRINGID_PKMNUNAFFECTED, STRINGID_PKMNFELLINLOVE,
STRINGID_PKMNSXINFATUATEDY, STRINGID_PKMNENERGYDRAINED, STRINGID_ITSUCKEDLIQUIDOOZE,
STRINGID_ELECTRICITYWEAKENED, STRINGID_FIREWEAKENED, STRINGID_BELLCHIMED,
STRINGID_BELLCHIMED, STRINGID_BELLCHIMED, STRINGID_BELLCHIMED,
STRINGID_SOOTHINGAROMA, STRINGID_PKMNFORESAWATTACK, STRINGID_PKMNCHOSEXASDESTINY,
STRINGID_PKMNBROKEFREE, STRINGID_ITAPPEAREDCAUGHT, STRINGID_AARGHALMOSTHADIT,
STRINGID_SHOOTSOCLOSE, STRINGID_ITISRAINING, STRINGID_ITISRAINING,
};
const u16 gRestUsedStringIds[] =
{
STRINGID_PKMNWENTTOSLEEP, STRINGID_PKMNSLEPTHEALTHY
};
const u16 gUproarOverTurnStringIds[] =
{
STRINGID_PKMNMAKINGUPROAR, STRINGID_PKMNCALMEDDOWN
};
const u16 gStockpileUsedStringIds[] =
{
STRINGID_PKMNSTOCKPILED, STRINGID_PKMNCANTSTOCKPILE,
};
const u16 gWokeUpStringIds[] =
{
STRINGID_PKMNWOKEUP, STRINGID_PKMNWOKEUPINUPROAR
};
const u16 gSwallowFailStringIds[] =
{
STRINGID_FAILEDTOSWALLOW, STRINGID_PKMNHPFULL
};
const u16 gUproarAwakeStringIds[] =
{
STRINGID_PKMNCANTSLEEPINUPROAR2, STRINGID_UPROARKEPTPKMNAWAKE, STRINGID_PKMNSTAYEDAWAKEUSING
};
const u16 gStatUpStringIds[] =
{
STRINGID_PKMNSSTATCHANGED, STRINGID_PKMNSSTATCHANGED2, STRINGID_STATSWONTINCREASE,
STRINGID_EMPTYSTRING3, STRINGID_USINGXTHEYOFZN, STRINGID_PKMNUSEDXTOGETPUMPED
};
const u16 gStatDownStringIds[] =
{
STRINGID_PKMNSSTATCHANGED3, STRINGID_PKMNSSTATCHANGED4, STRINGID_STATSWONTDECREASE, STRINGID_EMPTYSTRING3
};
const u16 gFirstTurnOfTwoStringIds[] =
{
STRINGID_PKMNWHIPPEDWHIRLWIND, STRINGID_PKMNTOOKSUNLIGHT, STRINGID_PKMNLOWEREDHEAD, STRINGID_PKMNISGLOWING,
STRINGID_PKMNFLEWHIGH, STRINGID_PKMNDUGHOLE, STRINGID_PKMNHIDUNDERWATER, STRINGID_PKMNSPRANGUP
};
const u16 gWrappedStringIds[] =
{
STRINGID_PKMNSQUEEZEDBYBIND, STRINGID_PKMNWRAPPEDBY, STRINGID_PKMNTRAPPEDINVORTEX,
STRINGID_PKMNCLAMPED, STRINGID_PKMNTRAPPEDINVORTEX, STRINGID_PKMNTRAPPEDBYSANDTOMB
};
const u16 gMistUsedStringIds[] =
{
STRINGID_PKMNSHROUDEDINMIST, STRINGID_BUTITFAILED
};
const u16 gFocusEnergyUsedStringIds[] =
{
STRINGID_PKMNGETTINGPUMPED, STRINGID_BUTITFAILED
};
const u16 gTransformUsedStringIds[] =
{
STRINGID_PKMNTRANSFORMEDINTO, STRINGID_BUTITFAILED
};
const u16 gSubsituteUsedStringIds[] =
{
STRINGID_PKMNMADESUBSTITUTE, STRINGID_TOOWEAKFORSUBSTITUTE
};
const u16 gGotPoisonedStringIds[] =
{
STRINGID_PKMNWASPOISONED, STRINGID_PKMNPOISONEDBY
};
const u16 gGotParalyzedStringIds[] =
{
STRINGID_PKMNWASPARALYZED, STRINGID_PKMNWASPARALYZEDBY
};
const u16 gFellAsleepStringIds[] =
{
STRINGID_PKMNFELLASLEEP, STRINGID_PKMNMADESLEEP,
};
const u16 gGotBurnedStringIds[] =
{
STRINGID_PKMNWASBURNED, STRINGID_PKMNBURNEDBY
};
const u16 gGotFrozenStringIds[] =
{
STRINGID_PKMNWASFROZEN, STRINGID_PKMNFROZENBY
};
const u16 gGotDefrostedStringIds[] =
{
STRINGID_PKMNWASDEFROSTED2, STRINGID_PKMNWASDEFROSTEDBY
};
const u16 gKOFailedStringIds[] =
{
STRINGID_ATTACKMISSED, STRINGID_PKMNUNAFFECTED
};
const u16 gAttractUsedStringIds[] =
{
STRINGID_PKMNFELLINLOVE, STRINGID_PKMNSXINFATUATEDY
};
const u16 gLeechSeedDrainStringIds[] =
{
STRINGID_PKMNENERGYDRAINED, STRINGID_ITSUCKEDLIQUIDOOZE
};
const u16 gSportsUsedStringIds[] =
{
STRINGID_ELECTRICITYWEAKENED, STRINGID_FIREWEAKENED
};
const u16 gPartyStatusHealStringIds[] =
{
STRINGID_BELLCHIMED, STRINGID_BELLCHIMED, STRINGID_BELLCHIMED, STRINGID_BELLCHIMED,
// interesting how there are four instances of the same string
STRINGID_SOOTHINGAROMA
};
const u16 gFutureMoveUsedStringIds[] =
{
STRINGID_PKMNFORESAWATTACK, STRINGID_PKMNCHOSEXASDESTINY
};
const u16 gBallEscapeStringIds[] =
{
STRINGID_PKMNBROKEFREE, STRINGID_ITAPPEAREDCAUGHT, STRINGID_AARGHALMOSTHADIT, STRINGID_SHOOTSOCLOSE
};
const u16 gWeatherContinuesStringIds[] =
{
STRINGID_ITISRAINING, STRINGID_ITISRAINING, STRINGID_ITISRAINING,
STRINGID_ITISRAINING, STRINGID_ITISRAINING, STRINGID_ITISRAINING,
STRINGID_SANDSTORMISRAGING, STRINGID_ITISRAINING, STRINGID_ITISRAINING,
STRINGID_ITISRAINING, STRINGID_SUNLIGHTSTRONG, STRINGID_ITISRAINING,
STRINGID_ITISRAINING, STRINGID_ITISRAINING, STRINGID_PKMNLOAFING,
STRINGID_PKMNWONTOBEY, STRINGID_PKMNTURNEDAWAY, STRINGID_PKMNPRETENDNOTNOTICE,
STRINGID_PKMNINCAPABLEOFPOWER, STRINGID_CREPTCLOSER, STRINGID_CANTGETCLOSER,
STRINGID_PKMNCURIOUSABOUTX, STRINGID_PKMNENTHRALLEDBYX, STRINGID_PKMNIGNOREDX,
STRINGID_ITISRAINING, STRINGID_ITISRAINING, STRINGID_SANDSTORMISRAGING,
STRINGID_ITISRAINING, STRINGID_ITISRAINING, STRINGID_ITISRAINING,
STRINGID_SUNLIGHTSTRONG, STRINGID_ITISRAINING, STRINGID_ITISRAINING, STRINGID_ITISRAINING
};
const u16 gInobedientStringIds[] =
{
STRINGID_PKMNLOAFING, STRINGID_PKMNWONTOBEY, STRINGID_PKMNTURNEDAWAY,
STRINGID_PKMNPRETENDNOTNOTICE, STRINGID_PKMNINCAPABLEOFPOWER
};
const u16 gSafariGetNearStringIds[] =
{
STRINGID_CREPTCLOSER, STRINGID_CANTGETCLOSER
};
const u16 gSafariPokeblockResultStringIds[] =
{
STRINGID_PKMNCURIOUSABOUTX, STRINGID_PKMNENTHRALLEDBYX, STRINGID_PKMNIGNOREDX
};
const u16 gTrainerItemCuredStatusStringIds[] =
{
STRINGID_PKMNSITEMSNAPPEDOUT, STRINGID_PKMNSITEMCUREDPARALYSIS, STRINGID_PKMNSITEMDEFROSTEDIT,
STRINGID_PKMNSITEMHEALEDBURN, STRINGID_PKMNSITEMCUREDPOISON, STRINGID_PKMNSITEMWOKEIT,
STRINGID_PKMNSITEMCUREDPROBLEM, STRINGID_PKMNSITEMNORMALIZEDSTATUS, STRINGID_PKMNSXPREVENTSBURNS,
STRINGID_PKMNSXPREVENTSYSZ, STRINGID_PKMNSXHADNOEFFECTONY, STRINGID_PKMNPREVENTSPARALYSISWITH,
STRINGID_PKMNSXPREVENTSYSZ, STRINGID_PKMNSXHADNOEFFECTONY, STRINGID_PKMNPREVENTSPOISONINGWITH,
STRINGID_PKMNSXPREVENTSYSZ, STRINGID_PKMNSXHADNOEFFECTONY, STRINGID_PKMNOBTAINEDX,
STRINGID_PKMNOBTAINEDX2, STRINGID_PKMNOBTAINEDXYOBTAINEDZ, STRINGID_PKMNRAISEDFIREPOWERWITH,
STRINGID_PKMNSXMADEYINEFFECTIVE, STRINGID_PKMNTRANSFERREDSOMEONESPC, STRINGID_PKMNTRANSFERREDLANETTESPC,
STRINGID_PKMNBOXSOMEONESPCFULL, STRINGID_PKMNBOXLANETTESPCFULL,
STRINGID_PKMNSITEMHEALEDBURN, STRINGID_PKMNSITEMCUREDPOISON, STRINGID_PKMNSITEMWOKEIT
};
const u16 gBerryEffectStringIds[] =
{
STRINGID_PKMNSITEMCUREDPROBLEM, STRINGID_PKMNSITEMNORMALIZEDSTATUS
};
const u16 gBRNPreventionStringIds[] =
{
STRINGID_PKMNSXPREVENTSBURNS, STRINGID_PKMNSXPREVENTSYSZ, STRINGID_PKMNSXHADNOEFFECTONY
};
const u16 gPRLZPreventionStringIds[] =
{
STRINGID_PKMNPREVENTSPARALYSISWITH, STRINGID_PKMNSXPREVENTSYSZ, STRINGID_PKMNSXHADNOEFFECTONY
};
const u16 gPSNPreventionStringIds[] =
{
STRINGID_PKMNPREVENTSPOISONINGWITH, STRINGID_PKMNSXPREVENTSYSZ, STRINGID_PKMNSXHADNOEFFECTONY
};
const u16 gItemSwapStringIds[] =
{
STRINGID_PKMNOBTAINEDX, STRINGID_PKMNOBTAINEDX2, STRINGID_PKMNOBTAINEDXYOBTAINEDZ
};
const u16 gFlashFireStringIds[] =
{
STRINGID_PKMNRAISEDFIREPOWERWITH, STRINGID_PKMNSXMADEYINEFFECTIVE
};
const u16 gCaughtMonStringIds[] =
{
STRINGID_PKMNTRANSFERREDSOMEONESPC, STRINGID_PKMNTRANSFERREDLANETTESPC, STRINGID_PKMNBOXSOMEONESPCFULL, STRINGID_PKMNBOXLANETTESPCFULL,
};
const u16 gTrappingMoves[] =
@@ -1102,9 +1265,10 @@ const u8 gText_PkmnGettingIntoPosition[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is
const u8 gText_PkmnBeganGrowlingDeeply[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} began growling deeply!");
const u8 gText_PkmnEagerForMore[] = _("{B_SCR_ACTIVE_NAME_WITH_PREFIX} is eager for more!");
const u16 gUnknown_085CCF0A[] =
const u16 gStringIds_85CCF0A[] =
{
0x016E, 0x016F, 0x0170, 0x0171
STRINGID_GLINTAPPEARSINEYE, STRINGID_PKMNGETTINGINTOPOSITION,
STRINGID_PKMNBEGANGROWLINGDEEPLY, STRINGID_PKMNEAGERFORMORE
};
const u8 gText_RefIfNothingIsDecided[] = _("REFEREE: If nothing is decided in\n3 turns, we will go to judging!");
@@ -1145,6 +1309,8 @@ const u8 gText_BattleRecordedOnPass[] = _("{B_PLAYER_NAME}s battle result was
const u8 gText_LinkTrainerWantsToBattlePause[] = _("{B_20}\nwants to battle!{PAUSE 49}");
const u8 gText_TwoLinkTrainersWantToBattlePause[] = _("{B_20} and {B_21}\nwant to battle!{PAUSE 49}");
// This is four lists of moves which use a different attack string in Japanese
// to the default. See the documentation for sub_814F950 for more detail.
static const u16 sUnknownMoveTable[] =
{
MOVE_SWORDS_DANCE, MOVE_STRENGTH, MOVE_GROWTH,
@@ -1159,16 +1325,16 @@ static const u16 sUnknownMoveTable[] =
MOVE_TRICK, MOVE_ASSIST, MOVE_INGRAIN, MOVE_KNOCK_OFF,
MOVE_CAMOUFLAGE, MOVE_ASTONISH, MOVE_ODOR_SLEUTH,
MOVE_GRASS_WHISTLE, MOVE_SHEER_COLD, MOVE_MUDDY_WATER,
MOVE_IRON_DEFENSE, MOVE_BOUNCE, MOVE_NONE,
MOVE_IRON_DEFENSE, MOVE_BOUNCE, 0,
MOVE_TELEPORT, MOVE_RECOVER, MOVE_BIDE, MOVE_AMNESIA,
MOVE_FLAIL, MOVE_TAUNT, MOVE_BULK_UP, MOVE_NONE,
MOVE_FLAIL, MOVE_TAUNT, MOVE_BULK_UP, 0,
MOVE_MEDITATE, MOVE_AGILITY, MOVE_MIMIC, MOVE_DOUBLE_TEAM,
MOVE_BARRAGE, MOVE_TRANSFORM, MOVE_STRUGGLE, MOVE_SCARY_FACE,
MOVE_CHARGE, MOVE_WISH, MOVE_BRICK_BREAK, MOVE_YAWN,
MOVE_FEATHER_DANCE, MOVE_TEETER_DANCE, MOVE_MUD_SPORT,
MOVE_FAKE_TEARS, MOVE_WATER_SPORT, MOVE_CALM_MIND, MOVE_NONE,
MOVE_FAKE_TEARS, MOVE_WATER_SPORT, MOVE_CALM_MIND, 0,
MOVE_POUND, MOVE_SCRATCH, MOVE_VICE_GRIP,
MOVE_WING_ATTACK, MOVE_FLY, MOVE_BIND, MOVE_SLAM,
@@ -1182,12 +1348,12 @@ static const u16 sUnknownMoveTable[] =
MOVE_FORESIGHT, MOVE_CHARM, MOVE_ATTRACT, MOVE_ROCK_SMASH,
MOVE_UPROAR, MOVE_SPIT_UP, MOVE_SWALLOW, MOVE_TORMENT,
MOVE_FLATTER, MOVE_ROLE_PLAY, MOVE_ENDEAVOR, MOVE_TICKLE,
MOVE_COVET, MOVE_NONE
MOVE_COVET, 0
};
static const u8 sDummyWeirdStatusString[] = {EOS, EOS, EOS, EOS, EOS, EOS, EOS, EOS, 0, 0};
static const u8 gUnknown_085CD42C[] =
static const u8 sUnknown_085CD42C[] =
{
0xFF, 0x1, 0x0, 0x1, 0x0, 0x0, 0x1, 0x1, 0xF, 0x6, 0x0, 0x0, 0xFF, 0x1,
0x1, 0x1, 0x0, 0x0, 0x0, 0x1, 0xF, 0x6, 0x0, 0x0, 0xEE, 0x1, 0x0, 0x1, 0x0,
@@ -1212,7 +1378,7 @@ static const u8 gUnknown_085CD42C[] =
0x6, 0x0, 0x0, 0x0, 0x1, 0xFF, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x6, 0x0, 0x0
};
static const u8 gUnknown_085CD54C[] =
static const u8 sUnknown_085CD54C[] =
{
0xFF, 0x1, 0x0, 0x1, 0x0, 0x0, 0x1, 0x1, 0xF, 0x6, 0x0, 0x0, 0xFF, 0x1,
0x1, 0x1, 0x0, 0x0, 0x0, 0x1, 0xF, 0x6, 0x0, 0x0, 0xEE, 0x1, 0x0, 0x1, 0x0,
@@ -1239,7 +1405,7 @@ static const u8 gUnknown_085CD54C[] =
static const u8 * const gUnknown_085CD660[] =
{
gUnknown_085CD42C, gUnknown_085CD54C
sUnknown_085CD42C, sUnknown_085CD54C
};
static const u8 sRecordedBattleTextSpeeds[] = {8, 4, 1, 0};
@@ -1249,18 +1415,18 @@ void BufferStringBattle(u16 stringID)
s32 i;
const u8* stringPtr = NULL;
gStringInfo = (struct StringInfoBattle*)(&gBattleBufferA[gActiveBank][4]);
gStringInfo = (struct StringInfoBattle*)(&gBattleBufferA[gActiveBattler][4]);
gLastUsedItem = gStringInfo->lastItem;
gLastUsedAbility = gStringInfo->lastAbility;
gBattleScripting.bank = gStringInfo->scrActive;
gBattleScripting.battler = gStringInfo->scrActive;
*(&gBattleStruct->field_52) = gStringInfo->unk1605E;
*(&gBattleStruct->hpScale) = gStringInfo->hpScale;
gStringBank = gStringInfo->StringBank;
gPotentialItemEffectBattler = gStringInfo->StringBank;
*(&gBattleStruct->stringMoveType) = gStringInfo->moveType;
for (i = 0; i < BATTLE_BANKS_COUNT; i++)
for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{
gAbilitiesPerBank[i] = gStringInfo->abilities[i];
gBattlerAbilities[i] = gStringInfo->abilities[i];
}
for (i = 0; i < TEXT_BUFF_ARRAY_COUNT; i++)
{
@@ -1320,7 +1486,7 @@ void BufferStringBattle(u16 stringID)
}
break;
case STRINGID_INTROSENDOUT: // poke first send-out
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
{
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
@@ -1365,7 +1531,7 @@ void BufferStringBattle(u16 stringID)
}
break;
case STRINGID_RETURNMON: // sending poke to ball msg
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER)
{
if (*(&gBattleStruct->hpScale) == 0)
stringPtr = gText_PkmnThatsEnough;
@@ -1392,7 +1558,7 @@ void BufferStringBattle(u16 stringID)
}
break;
case STRINGID_SWITCHINMON: // switch-in msg
if (GetBankSide(gBattleScripting.bank) == SIDE_PLAYER)
if (GetBattlerSide(gBattleScripting.battler) == B_SIDE_PLAYER)
{
if (*(&gBattleStruct->hpScale) == 0 || gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
stringPtr = gText_GoPkmn2;
@@ -1409,7 +1575,7 @@ void BufferStringBattle(u16 stringID)
{
if (gBattleTypeFlags & BATTLE_TYPE_x800000)
{
if (gBattleScripting.bank == 1)
if (gBattleScripting.battler == 1)
stringPtr = gText_Trainer1SentOutPkmn2;
else
stringPtr = gText_Trainer2SentOutPkmn;
@@ -1428,7 +1594,7 @@ void BufferStringBattle(u16 stringID)
{
if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS)
{
if (gBattleScripting.bank == 1)
if (gBattleScripting.battler == 1)
stringPtr = gText_Trainer1SentOutPkmn2;
else
stringPtr = gText_Trainer2SentOutPkmn;
@@ -1452,13 +1618,13 @@ void BufferStringBattle(u16 stringID)
stringPtr = gText_AttackerUsedX;
break;
case STRINGID_BATTLEEND: // battle end
if (gBattleTextBuff1[0] & BATTLE_OUTCOME_BIT_x80)
if (gBattleTextBuff1[0] & B_OUTCOME_LINK_BATTLE_RAN)
{
gBattleTextBuff1[0] &= ~(BATTLE_OUTCOME_BIT_x80);
if (GetBankSide(gActiveBank) == SIDE_OPPONENT && gBattleTextBuff1[0] != BATTLE_DREW)
gBattleTextBuff1[0] ^= (BATTLE_LOST | BATTLE_WON);
gBattleTextBuff1[0] &= ~(B_OUTCOME_LINK_BATTLE_RAN);
if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT && gBattleTextBuff1[0] != B_OUTCOME_DREW)
gBattleTextBuff1[0] ^= (B_OUTCOME_LOST | B_OUTCOME_WON);
if (gBattleTextBuff1[0] == BATTLE_LOST || gBattleTextBuff1[0] == BATTLE_DREW)
if (gBattleTextBuff1[0] == B_OUTCOME_LOST || gBattleTextBuff1[0] == B_OUTCOME_DREW)
stringPtr = gText_GotAwaySafely;
else if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
stringPtr = gText_TwoWildFled;
@@ -1467,23 +1633,23 @@ void BufferStringBattle(u16 stringID)
}
else
{
if (GetBankSide(gActiveBank) == SIDE_OPPONENT && gBattleTextBuff1[0] != BATTLE_DREW)
gBattleTextBuff1[0] ^= (BATTLE_LOST | BATTLE_WON);
if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT && gBattleTextBuff1[0] != B_OUTCOME_DREW)
gBattleTextBuff1[0] ^= (B_OUTCOME_LOST | B_OUTCOME_WON);
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
switch (gBattleTextBuff1[0])
{
case BATTLE_WON:
case B_OUTCOME_WON:
if (gBattleTypeFlags & BATTLE_TYPE_x800000)
stringPtr = gText_TwoInGameTrainersDefeated;
else
stringPtr = gText_TwoLinkTrainersDefeated;
break;
case BATTLE_LOST:
case B_OUTCOME_LOST:
stringPtr = gText_PlayerLostToTwo;
break;
case BATTLE_DREW:
case B_OUTCOME_DREW:
stringPtr = gText_PlayerBattledToDrawVsTwo;
break;
}
@@ -1492,13 +1658,13 @@ void BufferStringBattle(u16 stringID)
{
switch (gBattleTextBuff1[0])
{
case BATTLE_WON:
case B_OUTCOME_WON:
stringPtr = gText_PlayerDefeatedLinkTrainerTrainer1;
break;
case BATTLE_LOST:
case B_OUTCOME_LOST:
stringPtr = gText_PlayerLostAgainstTrainer1;
break;
case BATTLE_DREW:
case B_OUTCOME_DREW:
stringPtr = gText_PlayerBattledToDrawTrainer1;
break;
}
@@ -1507,13 +1673,13 @@ void BufferStringBattle(u16 stringID)
{
switch (gBattleTextBuff1[0])
{
case BATTLE_WON:
case B_OUTCOME_WON:
stringPtr = gText_PlayerDefeatedLinkTrainer;
break;
case BATTLE_LOST:
case B_OUTCOME_LOST:
stringPtr = gText_PlayerLostAgainstLinkTrainer;
break;
case BATTLE_DREW:
case B_OUTCOME_DREW:
stringPtr = gText_PlayerBattledToDrawLinkTrainer;
break;
}
@@ -1573,7 +1739,7 @@ static const u8* TryGetStatusString(u8* src)
}
#define HANDLE_NICKNAME_STRING_CASE(bank, monIndex) \
if (GetBankSide(bank) != SIDE_PLAYER) \
if (GetBattlerSide(bank) != B_SIDE_PLAYER) \
{ \
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) \
toCpy = gText_FoePkmnPrefix; \
@@ -1655,80 +1821,80 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
toCpy = gStringVar3;
break;
case B_TXT_PLAYER_MON1_NAME: // first player poke name
GetMonData(&gPlayerParty[gBattlePartyID[GetBankByIdentity(IDENTITY_PLAYER_MON1)]],
GetMonData(&gPlayerParty[gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]],
MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case B_TXT_OPPONENT_MON1_NAME: // first enemy poke name
GetMonData(&gEnemyParty[gBattlePartyID[GetBankByIdentity(IDENTITY_OPPONENT_MON1)]],
GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)]],
MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case B_TXT_PLAYER_MON2_NAME: // second player poke name
GetMonData(&gPlayerParty[gBattlePartyID[GetBankByIdentity(IDENTITY_PLAYER_MON2)]],
GetMonData(&gPlayerParty[gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT)]],
MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case B_TXT_OPPONENT_MON2_NAME: // second enemy poke name
GetMonData(&gEnemyParty[gBattlePartyID[GetBankByIdentity(IDENTITY_OPPONENT_MON2)]],
GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT)]],
MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case B_TXT_LINK_PLAYER_MON1_NAME: // link first player poke name
GetMonData(&gPlayerParty[gBattlePartyID[gLinkPlayers[multiplayerID].lp_field_18]],
GetMonData(&gPlayerParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].lp_field_18]],
MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case B_TXT_LINK_OPPONENT_MON1_NAME: // link first opponent poke name
GetMonData(&gEnemyParty[gBattlePartyID[gLinkPlayers[multiplayerID].lp_field_18 ^ 1]],
GetMonData(&gEnemyParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].lp_field_18 ^ 1]],
MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case B_TXT_LINK_PLAYER_MON2_NAME: // link second player poke name
GetMonData(&gPlayerParty[gBattlePartyID[gLinkPlayers[multiplayerID].lp_field_18 ^ 2]],
GetMonData(&gPlayerParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].lp_field_18 ^ 2]],
MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case B_TXT_LINK_OPPONENT_MON2_NAME: // link second opponent poke name
GetMonData(&gEnemyParty[gBattlePartyID[gLinkPlayers[multiplayerID].lp_field_18 ^ 3]],
GetMonData(&gEnemyParty[gBattlerPartyIndexes[gLinkPlayers[multiplayerID].lp_field_18 ^ 3]],
MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case B_TXT_ATK_NAME_WITH_PREFIX_MON1: // attacker name with prefix, only bank 0/1
HANDLE_NICKNAME_STRING_CASE(gBankAttacker,
gBattlePartyID[GetBankByIdentity(GET_BANK_SIDE(gBankAttacker))])
HANDLE_NICKNAME_STRING_CASE(gBattlerAttacker,
gBattlerPartyIndexes[GetBattlerAtPosition(GET_BATTLER_SIDE(gBattlerAttacker))])
break;
case B_TXT_ATK_PARTNER_NAME: // attacker partner name
if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
GetMonData(&gPlayerParty[gBattlePartyID[GetBankByIdentity(GET_BANK_SIDE(gBankAttacker)) + 2]], MON_DATA_NICKNAME, text);
if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
GetMonData(&gPlayerParty[gBattlerPartyIndexes[GetBattlerAtPosition(GET_BATTLER_SIDE(gBattlerAttacker)) + 2]], MON_DATA_NICKNAME, text);
else
GetMonData(&gEnemyParty[gBattlePartyID[GetBankByIdentity(GET_BANK_SIDE(gBankAttacker)) + 2]], MON_DATA_NICKNAME, text);
GetMonData(&gEnemyParty[gBattlerPartyIndexes[GetBattlerAtPosition(GET_BATTLER_SIDE(gBattlerAttacker)) + 2]], MON_DATA_NICKNAME, text);
StringGetEnd10(text);
toCpy = text;
break;
case B_TXT_ATK_NAME_WITH_PREFIX: // attacker name with prefix
HANDLE_NICKNAME_STRING_CASE(gBankAttacker, gBattlePartyID[gBankAttacker])
HANDLE_NICKNAME_STRING_CASE(gBattlerAttacker, gBattlerPartyIndexes[gBattlerAttacker])
break;
case B_TXT_DEF_NAME_WITH_PREFIX: // target name with prefix
HANDLE_NICKNAME_STRING_CASE(gBankTarget, gBattlePartyID[gBankTarget])
HANDLE_NICKNAME_STRING_CASE(gBattlerTarget, gBattlerPartyIndexes[gBattlerTarget])
break;
case B_TXT_EFF_NAME_WITH_PREFIX: // effect bank name with prefix
HANDLE_NICKNAME_STRING_CASE(gEffectBank, gBattlePartyID[gEffectBank])
HANDLE_NICKNAME_STRING_CASE(gEffectBattler, gBattlerPartyIndexes[gEffectBattler])
break;
case B_TXT_ACTIVE_NAME_WITH_PREFIX: // active bank name with prefix
HANDLE_NICKNAME_STRING_CASE(gActiveBank, gBattlePartyID[gActiveBank])
HANDLE_NICKNAME_STRING_CASE(gActiveBattler, gBattlerPartyIndexes[gActiveBattler])
break;
case B_TXT_SCR_ACTIVE_NAME_WITH_PREFIX: // scripting active bank name with prefix
HANDLE_NICKNAME_STRING_CASE(gBattleScripting.bank, gBattlePartyID[gBattleScripting.bank])
HANDLE_NICKNAME_STRING_CASE(gBattleScripting.battler, gBattlerPartyIndexes[gBattleScripting.battler])
break;
case B_TXT_CURRENT_MOVE: // current move name
if (gStringInfo->currentMove > LAST_MOVE_INDEX)
@@ -1736,11 +1902,11 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
else
toCpy = gMoveNames[gStringInfo->currentMove];
break;
case B_TXT_LAST_MOVE: // last used move name
if (gStringInfo->lastMove > LAST_MOVE_INDEX)
case B_TXT_LAST_MOVE: // originally used move name
if (gStringInfo->originallyUsedMove > LAST_MOVE_INDEX)
toCpy = gText_UnknownMoveTypes[gBattleStruct->stringMoveType];
else
toCpy = gMoveNames[gStringInfo->lastMove];
toCpy = gMoveNames[gStringInfo->originallyUsedMove];
break;
case B_TXT_LAST_ITEM: // last used item
if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
@@ -1749,10 +1915,10 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
{
if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
if ((gBattleScripting.multiplayerId != 0 && (gStringBank & BIT_SIDE))
|| (gBattleScripting.multiplayerId == 0 && !(gStringBank & BIT_SIDE)))
if ((gBattleScripting.multiplayerId != 0 && (gPotentialItemEffectBattler & BIT_SIDE))
|| (gBattleScripting.multiplayerId == 0 && !(gPotentialItemEffectBattler & BIT_SIDE)))
{
StringCopy(text, gEnigmaBerries[gStringBank].name);
StringCopy(text, gEnigmaBerries[gPotentialItemEffectBattler].name);
StringAppend(text, gText_BerrySuffix);
toCpy = text;
}
@@ -1763,9 +1929,9 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
}
else
{
if (gLinkPlayers[gBattleScripting.multiplayerId].lp_field_18 == gStringBank)
if (gLinkPlayers[gBattleScripting.multiplayerId].lp_field_18 == gPotentialItemEffectBattler)
{
StringCopy(text, gEnigmaBerries[gStringBank].name);
StringCopy(text, gEnigmaBerries[gPotentialItemEffectBattler].name);
StringAppend(text, gText_BerrySuffix);
toCpy = text;
}
@@ -1789,16 +1955,16 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
toCpy = gAbilityNames[gLastUsedAbility];
break;
case B_TXT_ATK_ABILITY: // attacker ability
toCpy = gAbilityNames[gAbilitiesPerBank[gBankAttacker]];
toCpy = gAbilityNames[gBattlerAbilities[gBattlerAttacker]];
break;
case B_TXT_DEF_ABILITY: // target ability
toCpy = gAbilityNames[gAbilitiesPerBank[gBankTarget]];
toCpy = gAbilityNames[gBattlerAbilities[gBattlerTarget]];
break;
case B_TXT_SCR_ACTIVE_ABILITY: // scripting active ability
toCpy = gAbilityNames[gAbilitiesPerBank[gBattleScripting.bank]];
toCpy = gAbilityNames[gBattlerAbilities[gBattleScripting.battler]];
break;
case B_TXT_EFF_ABILITY: // effect bank ability
toCpy = gAbilityNames[gAbilitiesPerBank[gEffectBank]];
toCpy = gAbilityNames[gBattlerAbilities[gEffectBattler]];
break;
case B_TXT_TRAINER1_CLASS: // trainer class name
if (gBattleTypeFlags & BATTLE_TYPE_SECRET_BASE)
@@ -1858,16 +2024,16 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
toCpy = gLinkPlayers[multiplayerID].name;
break;
case B_TXT_1F: // link partner name?
toCpy = gLinkPlayers[GetBankMultiplayerId(2 ^ gLinkPlayers[multiplayerID].lp_field_18)].name;
toCpy = gLinkPlayers[GetBattlerMultiplayerId(2 ^ gLinkPlayers[multiplayerID].lp_field_18)].name;
break;
case B_TXT_20: // link opponent 1 name?
toCpy = gLinkPlayers[GetBankMultiplayerId(1 ^ gLinkPlayers[multiplayerID].lp_field_18)].name;
toCpy = gLinkPlayers[GetBattlerMultiplayerId(1 ^ gLinkPlayers[multiplayerID].lp_field_18)].name;
break;
case B_TXT_21: // link opponent 2 name?
toCpy = gLinkPlayers[GetBankMultiplayerId(3 ^ gLinkPlayers[multiplayerID].lp_field_18)].name;
toCpy = gLinkPlayers[GetBattlerMultiplayerId(3 ^ gLinkPlayers[multiplayerID].lp_field_18)].name;
break;
case B_TXT_22: // link scripting active name
toCpy = gLinkPlayers[GetBankMultiplayerId(gBattleScripting.bank)].name;
toCpy = gLinkPlayers[GetBattlerMultiplayerId(gBattleScripting.battler)].name;
break;
case B_TXT_PLAYER_NAME: // player name
if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
@@ -1888,7 +2054,7 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
}
else
{
toCpy = GetTrainer1LoseText();
toCpy = GetTrainerALoseText();
}
break;
case B_TXT_TRAINER1_WIN_TEXT: // trainerA win text
@@ -1904,46 +2070,46 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
}
break;
case B_TXT_26: // ?
HANDLE_NICKNAME_STRING_CASE(gBattleScripting.bank, *(&gBattleStruct->field_52))
HANDLE_NICKNAME_STRING_CASE(gBattleScripting.battler, *(&gBattleStruct->field_52))
break;
case B_TXT_PC_CREATOR_NAME: // lanette pc
if (FlagGet(SYS_PC_LANETTE))
if (FlagGet(FLAG_SYS_PC_LANETTE))
toCpy = gText_Lanettes;
else
toCpy = gText_Someones;
break;
case B_TXT_ATK_PREFIX2:
if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
toCpy = gText_AllyPkmnPrefix2;
else
toCpy = gText_FoePkmnPrefix3;
break;
case B_TXT_DEF_PREFIX2:
if (GetBankSide(gBankTarget) == SIDE_PLAYER)
if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER)
toCpy = gText_AllyPkmnPrefix2;
else
toCpy = gText_FoePkmnPrefix3;
break;
case B_TXT_ATK_PREFIX1:
if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
toCpy = gText_AllyPkmnPrefix;
else
toCpy = gText_FoePkmnPrefix2;
break;
case B_TXT_DEF_PREFIX1:
if (GetBankSide(gBankTarget) == SIDE_PLAYER)
if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER)
toCpy = gText_AllyPkmnPrefix;
else
toCpy = gText_FoePkmnPrefix2;
break;
case B_TXT_ATK_PREFIX3:
if (GetBankSide(gBankAttacker) == SIDE_PLAYER)
if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER)
toCpy = gText_AllyPkmnPrefix3;
else
toCpy = gText_FoePkmnPrefix4;
break;
case B_TXT_DEF_PREFIX3:
if (GetBankSide(gBankTarget) == SIDE_PLAYER)
if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER)
toCpy = gText_AllyPkmnPrefix3;
else
toCpy = gText_FoePkmnPrefix4;
@@ -1985,7 +2151,7 @@ u32 BattleStringExpandPlaceholders(const u8* src, u8* dst)
}
else
{
toCpy = GetTrainer2LoseText();
toCpy = GetTrainerBLoseText();
}
break;
case B_TXT_TRAINER2_WIN_TEXT:
@@ -2085,7 +2251,7 @@ static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst)
srcID += 2;
break;
case B_BUFF_MON_NICK_WITH_PREFIX: // poke nick with prefix
if (GetBankSide(src[srcID + 1]) == SIDE_PLAYER)
if (GetBattlerSide(src[srcID + 1]) == B_SIDE_PLAYER)
{
GetMonData(&gPlayerParty[src[srcID + 2]], MON_DATA_NICKNAME, text);
}
@@ -2111,14 +2277,14 @@ static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst)
srcID += 3;
break;
case B_BUFF_MON_NICK: // poke nick without prefix
if (GetBankSide(src[srcID + 1]) == SIDE_PLAYER)
if (GetBattlerSide(src[srcID + 1]) == B_SIDE_PLAYER)
GetMonData(&gPlayerParty[src[srcID + 2]], MON_DATA_NICKNAME, dst);
else
GetMonData(&gEnemyParty[src[srcID + 2]], MON_DATA_NICKNAME, dst);
StringGetEnd10(dst);
srcID += 3;
break;
case B_BUFF_NEGATIVE_FLAVOUR: // flavour table
case B_BUFF_NEGATIVE_FLAVOR: // flavor table
StringAppend(dst, gPokeblockWasTooXStringTable[src[srcID + 1]]);
srcID += 2;
break;
@@ -2132,9 +2298,9 @@ static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst)
{
if (hword == ITEM_ENIGMA_BERRY)
{
if (gLinkPlayers[gBattleScripting.multiplayerId].lp_field_18 == gStringBank)
if (gLinkPlayers[gBattleScripting.multiplayerId].lp_field_18 == gPotentialItemEffectBattler)
{
StringCopy(dst, gEnigmaBerries[gStringBank].name);
StringCopy(dst, gEnigmaBerries[gPotentialItemEffectBattler].name);
StringAppend(dst, gText_BerrySuffix);
}
else
@@ -2151,6 +2317,10 @@ static void ExpandBattleTextBuffPlaceholders(const u8 *src, u8 *dst)
}
}
// Loads one of two text strings into the provided buffer. This is functionally
// unused, since the value loaded into the buffer is not read; it loaded one of
// two particles (either "は" or "の") which works in tandem with sub_814F950
// below to effect changes in the meaning of the line.
static void sub_814F8F8(u8* textBuff)
{
s32 counter = 0;
@@ -2158,7 +2328,7 @@ static void sub_814F8F8(u8* textBuff)
while (counter != 4)
{
if (sUnknownMoveTable[i] == MOVE_NONE)
if (sUnknownMoveTable[i] == 0)
counter++;
if (sUnknownMoveTable[i++] == gStringInfo->currentMove)
break;
@@ -2173,6 +2343,24 @@ static void sub_814F8F8(u8* textBuff)
}
}
// Appends "!" to the text buffer `dst`. In the original Japanese this looked
// into the table of moves at sUnknownMoveTable and varied the line accordingly.
//
// gText_ExclamationMark was a plain "!", used for any attack not on the list.
// It resulted in the translation "<NAME>'s <ATTACK>!".
//
// gText_ExclamationMark2 was "を つかった!". This resulted in the translation
// "<NAME> used <ATTACK>!", which was used for all attacks in English.
//
// gText_ExclamationMark3 was "した!". This was used for those moves whose
// names were verbs, such as Recover, and resulted in translations like "<NAME>
// recovered itself!".
//
// gText_ExclamationMark4 was "を した!" This resulted in a translation of
// "<NAME> did an <ATTACK>!".
//
// gText_ExclamationMark5 was " こうげき!" This resulted in a translation of
// "<NAME>'s <ATTACK> attack!".
static void sub_814F950(u8* dst)
{
s32 counter = 0;
@@ -2237,7 +2425,7 @@ void BattleHandleAddTextPrinter(const u8 *text, u8 arg1)
textSubPrinter.letterSpacing = r8[(12 * arg1) + 4];
textSubPrinter.lineSpacing = r8[(12 * arg1) + 5];
textSubPrinter.fontColor_l = 0;
textSubPrinter.fontColor_h = r8[(12 * arg1) + 7];
textSubPrinter.fgColor = r8[(12 * arg1) + 7];
textSubPrinter.bgColor = r8[(12 * arg1) + 8];
textSubPrinter.shadowColor = r8[(12 * arg1) + 9];
@@ -2264,9 +2452,9 @@ void BattleHandleAddTextPrinter(const u8 *text, u8 arg1)
if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
speed = 1;
else if (gBattleTypeFlags & BATTLE_TYPE_RECORDED)
speed = sRecordedBattleTextSpeeds[sub_8185FC4()];
speed = sRecordedBattleTextSpeeds[GetTextSpeedInRecordedBattle()];
else
speed = sav2_get_text_speed();
speed = GetPlayerTextSpeed();
gTextFlags.flag_0 = 1;
}
@@ -2287,10 +2475,10 @@ void BattleHandleAddTextPrinter(const u8 *text, u8 arg1)
void SetPpNumbersPaletteInMoveSelection(void)
{
struct ChooseMoveStruct *chooseMoveStruct = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBank][4]);
struct ChooseMoveStruct *chooseMoveStruct = (struct ChooseMoveStruct*)(&gBattleBufferA[gActiveBattler][4]);
const u16 *palPtr = gUnknown_08D85620;
u8 var = GetCurrentPpToMaxPpState(chooseMoveStruct->currentPp[gMoveSelectionCursor[gActiveBank]],
chooseMoveStruct->maxPp[gMoveSelectionCursor[gActiveBank]]);
u8 var = GetCurrentPpToMaxPpState(chooseMoveStruct->currentPp[gMoveSelectionCursor[gActiveBattler]],
chooseMoveStruct->maxPp[gMoveSelectionCursor[gActiveBattler]]);
gPlttBufferUnfaded[92] = palPtr[(var * 2) + 0];
gPlttBufferUnfaded[91] = palPtr[(var * 2) + 1];
+2424 -2880
View File
File diff suppressed because it is too large Load Diff
+1874
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+1009 -1222
View File
File diff suppressed because it is too large Load Diff
+210
View File
@@ -0,0 +1,210 @@
#include "global.h"
#include "battle.h"
#include "battle_controllers.h"
#include "malloc.h"
#include "pokemon.h"
#include "event_data.h"
#include "constants/abilities.h"
#include "random.h"
#include "battle_scripts.h"
extern u8 gUnknown_0203CF00[];
extern void sub_81D55D0(void);
extern void sub_81D5694(void);
extern u8 pokemon_order_func(u8);
extern void sub_81B8FB0(u8, u8);
void AllocateBattleResources(void)
{
gBattleResources = gBattleResources; // something dumb needed to match
if (gBattleTypeFlags & BATTLE_TYPE_x4000000)
sub_81D55D0();
gBattleStruct = AllocZeroed(sizeof(*gBattleStruct));
gBattleResources = AllocZeroed(sizeof(*gBattleResources));
gBattleResources->secretBase = AllocZeroed(sizeof(*gBattleResources->secretBase));
gBattleResources->flags = AllocZeroed(sizeof(*gBattleResources->flags));
gBattleResources->battleScriptsStack = AllocZeroed(sizeof(*gBattleResources->battleScriptsStack));
gBattleResources->battleCallbackStack = AllocZeroed(sizeof(*gBattleResources->battleCallbackStack));
gBattleResources->statsBeforeLvlUp = AllocZeroed(sizeof(*gBattleResources->statsBeforeLvlUp));
gBattleResources->ai = AllocZeroed(sizeof(*gBattleResources->ai));
gBattleResources->battleHistory = AllocZeroed(sizeof(*gBattleResources->battleHistory));
gBattleResources->AI_ScriptsStack = AllocZeroed(sizeof(*gBattleResources->AI_ScriptsStack));
gLinkBattleSendBuffer = AllocZeroed(BATTLE_BUFFER_LINK_SIZE);
gLinkBattleRecvBuffer = AllocZeroed(BATTLE_BUFFER_LINK_SIZE);
gUnknown_0202305C = AllocZeroed(0x2000);
gUnknown_02023060 = AllocZeroed(0x1000);
if (gBattleTypeFlags & BATTLE_TYPE_SECRET_BASE)
{
u16 currSecretBaseId = VarGet(VAR_0x4054);
CreateSecretBaseEnemyParty(&gSaveBlock1Ptr->secretBases[currSecretBaseId]);
}
}
void FreeBattleResources(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_x4000000)
sub_81D5694();
if (gBattleResources != NULL)
{
FREE_AND_SET_NULL(gBattleStruct);
FREE_AND_SET_NULL(gBattleResources->secretBase);
FREE_AND_SET_NULL(gBattleResources->flags);
FREE_AND_SET_NULL(gBattleResources->battleScriptsStack);
FREE_AND_SET_NULL(gBattleResources->battleCallbackStack);
FREE_AND_SET_NULL(gBattleResources->statsBeforeLvlUp);
FREE_AND_SET_NULL(gBattleResources->ai);
FREE_AND_SET_NULL(gBattleResources->battleHistory);
FREE_AND_SET_NULL(gBattleResources->AI_ScriptsStack);
FREE_AND_SET_NULL(gBattleResources);
FREE_AND_SET_NULL(gLinkBattleSendBuffer);
FREE_AND_SET_NULL(gLinkBattleRecvBuffer);
FREE_AND_SET_NULL(gUnknown_0202305C);
FREE_AND_SET_NULL(gUnknown_02023060);
}
}
void AdjustFriendshipOnBattleFaint(u8 battlerId)
{
u8 opposingBank;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
u8 opposingBank2;
opposingBank = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
opposingBank2 = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
if (gBattleMons[opposingBank2].level > gBattleMons[opposingBank].level)
opposingBank = opposingBank2;
}
else
{
opposingBank = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
}
if (gBattleMons[opposingBank].level > gBattleMons[battlerId].level)
{
if (gBattleMons[opposingBank].level - gBattleMons[battlerId].level > 29)
AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], 8);
else
AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], 6);
}
else
{
AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], 6);
}
}
void sub_80571DC(u8 battlerId, u8 arg1)
{
if (GetBattlerSide(battlerId) != B_SIDE_OPPONENT)
{
s32 i;
// gBattleStruct->field_60[0][i]
for (i = 0; i < 3; i++)
gUnknown_0203CF00[i] = *(0 * 3 + i + (u8*)(gBattleStruct->field_60));
sub_81B8FB0(pokemon_order_func(gBattlerPartyIndexes[battlerId]), pokemon_order_func(arg1));
for (i = 0; i < 3; i++)
*(0 * 3 + i + (u8*)(gBattleStruct->field_60)) = gUnknown_0203CF00[i];
}
}
u32 sub_805725C(u8 battlerId)
{
u32 effect = 0;
do
{
switch (gBattleCommunication[MULTIUSE_STATE])
{
case 0:
if (gBattleMons[battlerId].status1 & STATUS1_SLEEP)
{
if (UproarWakeUpCheck(battlerId))
{
gBattleMons[battlerId].status1 &= ~(STATUS1_SLEEP);
gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE);
BattleScriptPushCursor();
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp;
effect = 2;
}
else
{
u32 toSub;
if (gBattleMons[battlerId].ability == ABILITY_EARLY_BIRD)
toSub = 2;
else
toSub = 1;
if ((gBattleMons[battlerId].status1 & STATUS1_SLEEP) < toSub)
gBattleMons[battlerId].status1 &= ~(STATUS1_SLEEP);
else
gBattleMons[battlerId].status1 -= toSub;
if (gBattleMons[battlerId].status1 & STATUS1_SLEEP)
{
gBattlescriptCurrInstr = BattleScript_MoveUsedIsAsleep;
effect = 2;
}
else
{
gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE);
BattleScriptPushCursor();
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp;
effect = 2;
}
}
}
gBattleCommunication[MULTIUSE_STATE]++;
break;
case 1:
if (gBattleMons[battlerId].status1 & STATUS1_FREEZE)
{
if (Random() % 5 != 0)
{
gBattlescriptCurrInstr = BattleScript_MoveUsedIsFrozen;
}
else
{
gBattleMons[battlerId].status1 &= ~(STATUS1_FREEZE);
BattleScriptPushCursor();
gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze;
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
}
effect = 2;
}
gBattleCommunication[MULTIUSE_STATE]++;
break;
case 2:
break;
}
} while (gBattleCommunication[MULTIUSE_STATE] != 2 && effect == 0);
if (effect == 2)
{
gActiveBattler = battlerId;
BtlController_EmitSetMonData(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1);
MarkBattlerForControllerExec(gActiveBattler);
}
return effect;
}
+14 -20
View File
@@ -2,9 +2,9 @@
#include "berry.h"
#include "main.h"
#include "item.h"
#include "items.h"
#include "constants/items.h"
#include "text.h"
#include "rng.h"
#include "random.h"
#include "event_data.h"
#include "fieldmap.h"
@@ -14,16 +14,10 @@ extern void CB2_ChooseBerry(void);
extern const u8* GetFieldObjectScriptPointerForComparison(void);
extern bool8 sub_8092E9C(u8, u8, u8);
extern u16 gScriptItemId;
extern u16 gSpecialVar_ItemId;
extern const u8 BerryTreeScript[];
#define BERRY_NAME_LENGTH 6
#define FIRST_BERRY ITEM_CHERI_BERRY
#define LAST_BERRY ITEM_ENIGMA_BERRY
static const u8 sBerryDescriptionPart1_Cheri[] = _("Blooms with delicate pretty flowers.");
static const u8 sBerryDescriptionPart2_Cheri[] = _("The bright red BERRY is very spicy.");
static const u8 sBerryDescriptionPart1_Chesto[] = _("The BERRYs thick skin and fruit are");
@@ -1062,28 +1056,28 @@ u8 GetStageByBerryTreeId(u8 id)
u8 ItemIdToBerryType(u16 item)
{
u16 berry = item - FIRST_BERRY;
u16 berry = item - FIRST_BERRY_INDEX;
if (berry > LAST_BERRY - FIRST_BERRY)
if (berry > LAST_BERRY_INDEX - FIRST_BERRY_INDEX)
return 1;
else
return item - FIRST_BERRY + 1;
return ITEM_TO_BERRY(item);
}
u16 BerryTypeToItemId(u16 berry)
{
u16 item = berry - 1;
if (item > LAST_BERRY - FIRST_BERRY)
return FIRST_BERRY;
if (item > LAST_BERRY_INDEX - FIRST_BERRY_INDEX)
return FIRST_BERRY_INDEX;
else
return berry + FIRST_BERRY - 1;
return berry + FIRST_BERRY_INDEX - 1;
}
void GetBerryNameByBerryType(u8 berry, u8 *string)
{
memcpy(string, GetBerryInfo(berry)->name, BERRY_NAME_LENGTH);
string[BERRY_NAME_LENGTH] = EOS;
memcpy(string, GetBerryInfo(berry)->name, BERRY_NAME_COUNT - 1);
string[BERRY_NAME_COUNT - 1] = EOS;
}
void GetBerryCountStringByBerryType(u8 berry, u8* dest, u32 berryCount)
@@ -1169,7 +1163,7 @@ void FieldObjectInteractionGetBerryTreeData(void)
id = FieldObjectGetBerryTreeId(gSelectedMapObject);
berry = GetBerryTypeByBerryTreeId(id);
ResetBerryTreeSparkleFlag(id);
unk = gScriptLastTalked;
unk = gSpecialVar_LastTalked;
num = gSaveBlock1Ptr->location.mapNum;
group = gSaveBlock1Ptr->location.mapGroup;
if (sub_8092E9C(unk, num, group))
@@ -1202,7 +1196,7 @@ void Bag_ChooseBerry(void)
void FieldObjectInteractionPlantBerryTree(void)
{
u8 berry = ItemIdToBerryType(gScriptItemId);
u8 berry = ItemIdToBerryType(gSpecialVar_ItemId);
PlantBerryTree(FieldObjectGetBerryTreeId(gSelectedMapObject), berry, 1, TRUE);
FieldObjectInteractionGetBerryTreeData();
@@ -1219,7 +1213,7 @@ void FieldObjectInteractionPickBerryTree(void)
void FieldObjectInteractionRemoveBerryTree(void)
{
RemoveBerryTree(FieldObjectGetBerryTreeId(gSelectedMapObject));
sub_8092EF0(gScriptLastTalked, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
sub_8092EF0(gSpecialVar_LastTalked, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup);
}
u8 PlayerHasBerries(void)
+3617 -12
View File
File diff suppressed because it is too large Load Diff
+65 -270
View File
@@ -1,5 +1,3 @@
// Includes
#include "global.h"
#include "gpu_regs.h"
#include "multiboot.h"
@@ -8,8 +6,9 @@
#include "main.h"
#include "sprite.h"
#include "task.h"
#include "unknown_task.h"
#include "scanline_effect.h"
#include "window.h"
#include "text.h"
#include "menu.h"
#include "m4a.h"
@@ -36,9 +35,9 @@ static void berry_fix_bg_hide(void);
// .rodata
static const u8 gUnknown_08617E78[] = _("Berry Program Update");
static const u8 gUnknown_08617E8D[] = _("Ruby/Sapphire");
static const u8 gUnknown_08617E9B[] = _("Emerald");
static const u8 sUnknown_08617E78[] = _("Berry Program Update");
static const u8 sUnknown_08617E8D[] = _("Ruby/Sapphire");
static const u8 sUnknown_08617E9B[] = _("Emerald");
static const u8 Unknown_08617EA3[] = _("The Berry Program on your POKéMON\nRuby/Sapphire Game Pak will be updated.\n{COLOR RED}{SHADOW LIGHT_RED}Press the A Button.");
static const u8 Unknown_08617F07[] = _("Please ensure the connection of your\nGame Boy Advance system matches this.\n{COLOR RED}{SHADOW LIGHT_RED}YES: Press the A Button.\nNO: Turn off the power and try again.");
@@ -63,15 +62,15 @@ static const struct WindowTemplate gUnknown_08618110[] = {
{-1}
};
static const u16 gUnknown_08618138[] = {
static const u16 sUnknown_08618138[] = {
0x7fff, 0x7fff, 0x318c, 0x675a,
0x043c, 0x3aff, 0x0664, 0x4bd2,
0x6546, 0x7b14, 0x7fff, 0x318c,
0x675a, 0x0000, 0x0000, 0x0000
};
static const u8 gUnknown_08618158[] = {10, 11, 12};
static const u8 gUnknown_0861815B[] = { 0, 10, 13};
static const u8 sUnknown_08618158[] = {10, 11, 12};
static const u8 sUnknown_0861815B[] = { 0, 10, 13};
static const u8 *const gUnknown_08618160[] = {
Unknown_08617F07,
@@ -82,50 +81,50 @@ static const u8 *const gUnknown_08618160[] = {
Unknown_08617EA3
};
extern const u8 gUnknown_08DD87C0[];
extern const u8 gUnknown_08DD8EE0[];
extern const u8 gUnknown_08DD8780[];
extern const u8 gUnknown_08DD90E0[];
extern const u8 gUnknown_08DD9718[];
extern const u8 gUnknown_08DD9080[];
extern const u8 gUnknown_08DD98B4[];
extern const u8 gUnknown_08DD9E58[];
extern const u8 gUnknown_08DD9874[];
extern const u8 gUnknown_08DDA02C[];
extern const u8 gUnknown_08DDA63C[];
extern const u8 gUnknown_08DD9FEC[];
extern const u8 gUnknown_08DDA840[];
extern const u8 gUnknown_08DDAE40[];
extern const u8 gUnknown_08DDA800[];
extern const u8 gUnknown_08DDB020[];
extern const u8 gUnknown_08DDB2C4[];
extern const u8 gUnknown_08DDAFE0[];
extern const u8 gBerryFixGameboy_Gfx[];
extern const u8 gBerryFixGameboy_Tilemap[];
extern const u8 gBerryFixGameboy_Pal[];
extern const u8 gBerryFixGameboyLogo_Gfx[];
extern const u8 gBerryFixGameboyLogo_Tilemap[];
extern const u8 gBerryFixGameboyLogo_Pal[];
extern const u8 gBerryFixGbaTransfer_Gfx[];
extern const u8 gBerryFixGbaTransfer_Tilemap[];
extern const u8 gBerryFixGbaTransfer_Pal[];
extern const u8 gBerryFixGbaTransferHighlight_Gfx[];
extern const u8 gBerryFixGbaTransferHighlight_Tilemap[];
extern const u8 gBerryFixGbaTransferHighlight_Pal[];
extern const u8 gBerryFixGbaTransferError_Gfx[];
extern const u8 gBerryFixGbaTransferError_Tilemap[];
extern const u8 gBerryFixGbaTransferError_Pal[];
extern const u8 gBerryFixWindow_Gfx[];
extern const u8 gBerryFixWindow_Tilemap[];
extern const u8 gBerryFixWindow_Pal[];
static const u8 *const gUnknown_08618178[][3] = {
{
gUnknown_08DD87C0,
gUnknown_08DD8EE0,
gUnknown_08DD8780
gBerryFixGameboy_Gfx,
gBerryFixGameboy_Tilemap,
gBerryFixGameboy_Pal
}, {
gUnknown_08DD90E0,
gUnknown_08DD9718,
gUnknown_08DD9080
gBerryFixGameboyLogo_Gfx,
gBerryFixGameboyLogo_Tilemap,
gBerryFixGameboyLogo_Pal
}, {
gUnknown_08DD98B4,
gUnknown_08DD9E58,
gUnknown_08DD9874
gBerryFixGbaTransfer_Gfx,
gBerryFixGbaTransfer_Tilemap,
gBerryFixGbaTransfer_Pal
}, {
gUnknown_08DDA02C,
gUnknown_08DDA63C,
gUnknown_08DD9FEC
gBerryFixGbaTransferHighlight_Gfx,
gBerryFixGbaTransferHighlight_Tilemap,
gBerryFixGbaTransferHighlight_Pal
}, {
gUnknown_08DDA840,
gUnknown_08DDAE40,
gUnknown_08DDA800
gBerryFixGbaTransferError_Gfx,
gBerryFixGbaTransferError_Tilemap,
gBerryFixGbaTransferError_Pal
}, {
gUnknown_08DDB020,
gUnknown_08DDB2C4,
gUnknown_08DDAFE0
gBerryFixWindow_Gfx,
gBerryFixWindow_Tilemap,
gBerryFixWindow_Pal
},
};
@@ -134,7 +133,7 @@ extern const u8 gMultiBootProgram_BerryGlitchFix_End[];
// .text
void InitBerryFixProgram(void)
void CB2_InitBerryFixProgram(void)
{
DisableInterrupts(0xFFFF);
EnableInterrupts(0x0001);
@@ -142,7 +141,7 @@ void InitBerryFixProgram(void)
SetVBlankCallback(NULL);
ResetSpriteData();
ResetTasks();
remove_some_task();
ScanlineEffect_Stop();
SetGpuReg(REG_OFFSET_DISPCNT, 0x0000);
berry_fix_mb_manager = AllocZeroed(0x50);
berry_fix_mb_manager->state = 0;
@@ -218,10 +217,9 @@ static void berry_fix_main(void)
}
}
#ifdef NONMATCHING
static void berry_fix_gpu_set(void)
{
s32 width;
s32 width, left;
SetGpuReg(REG_OFFSET_BG0CNT, 0x0000);
SetGpuReg(REG_OFFSET_BG1CNT, 0x0000);
@@ -244,236 +242,33 @@ static void berry_fix_gpu_set(void)
InitWindows(gUnknown_08618110);
DeactivateAllTextPrinters();
DmaCopy32(3, gUnknown_08618138, BG_PLTT + 0x1E0, 0x20);
DmaCopy32(3, sUnknown_08618138, BG_PLTT + 0x1E0, 0x20);
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP);
FillWindowPixelBuffer(2, 0);
FillWindowPixelBuffer(3, 0);
FillWindowPixelBuffer(0, 0xAA);
// This block is a meme among memes
width = (0x78 - GetStringWidth(0, gUnknown_08617E9B, 0)) / 2;
box_print(2, 0, width, 3, gUnknown_0861815B, -1, gUnknown_08617E9B);
width = (s32)(0x78 - GetStringWidth(0, gUnknown_08617E9B, 0)) / 2 + 0x78;
box_print(2, 0, width, 3, gUnknown_0861815B, -1, gUnknown_08617E8D);
width = (0x70 - GetStringWidth(0, gUnknown_08617E8D, 0)) / 2;
box_print(3, 0, width, 0, gUnknown_0861815B, -1, gUnknown_08617E8D);
width = (0xd0 - GetStringWidth(1, gUnknown_08617E78, 0)) / 2;
box_print(0, 1, width, 2, gUnknown_08618158, -1, gUnknown_08617E78);
width = GetStringWidth(0, sUnknown_08617E9B, 0);
left = (0x78 - width) / 2;
box_print(2, 0, left, 3, sUnknown_0861815B, TEXT_SPEED_FF, sUnknown_08617E9B);
width = GetStringWidth(0, sUnknown_08617E8D, 0);
left = (0x78 - width) / 2 + 0x78;
box_print(2, 0, left, 3, sUnknown_0861815B, TEXT_SPEED_FF, sUnknown_08617E8D);
width = GetStringWidth(0, sUnknown_08617E8D, 0);
left = (0x70 - width) / 2;
box_print(3, 0, left, 0, sUnknown_0861815B, TEXT_SPEED_FF, sUnknown_08617E8D);
width = GetStringWidth(1, sUnknown_08617E78, 0);
left = (0xD0 - width) / 2;
box_print(0, 1, left, 2, sUnknown_08618158, TEXT_SPEED_FF, sUnknown_08617E78);
CopyWindowToVram(2, 2);
CopyWindowToVram(3, 2);
CopyWindowToVram(0, 2);
}
#else
__attribute__((naked)) static void berry_fix_gpu_set(void)
{
asm(".syntax unified\n"
"\tpush {r4-r6,lr}\n"
"\tmov r6, r8\n"
"\tpush {r6}\n"
"\tsub sp, 0x10\n"
"\tmovs r0, 0x8\n"
"\tmovs r1, 0\n"
"\tbl SetGpuReg\n"
"\tmovs r0, 0xA\n"
"\tmovs r1, 0\n"
"\tbl SetGpuReg\n"
"\tmovs r0, 0x10\n"
"\tmovs r1, 0\n"
"\tbl SetGpuReg\n"
"\tmovs r0, 0x12\n"
"\tmovs r1, 0\n"
"\tbl SetGpuReg\n"
"\tmovs r0, 0x14\n"
"\tmovs r1, 0\n"
"\tbl SetGpuReg\n"
"\tmovs r0, 0x16\n"
"\tmovs r1, 0\n"
"\tbl SetGpuReg\n"
"\tmovs r0, 0x50\n"
"\tmovs r1, 0\n"
"\tbl SetGpuReg\n"
"\tmovs r1, 0\n"
"\tstr r1, [sp, 0xC]\n"
"\tldr r4, =0x040000d4\n"
"\tadd r0, sp, 0xC\n"
"\tstr r0, [r4]\n"
"\tmovs r0, 0xC0\n"
"\tlsls r0, 19\n"
"\tstr r0, [r4, 0x4]\n"
"\tldr r0, =0x85006000\n"
"\tstr r0, [r4, 0x8]\n"
"\tldr r0, [r4, 0x8]\n"
"\tstr r1, [sp, 0xC]\n"
"\tadd r0, sp, 0xC\n"
"\tstr r0, [r4]\n"
"\tmovs r0, 0xE0\n"
"\tlsls r0, 19\n"
"\tstr r0, [r4, 0x4]\n"
"\tldr r2, =0x85000100\n"
"\tstr r2, [r4, 0x8]\n"
"\tldr r0, [r4, 0x8]\n"
"\tstr r1, [sp, 0xC]\n"
"\tadd r0, sp, 0xC\n"
"\tstr r0, [r4]\n"
"\tmovs r0, 0xA0\n"
"\tlsls r0, 19\n"
"\tstr r0, [r4, 0x4]\n"
"\tstr r2, [r4, 0x8]\n"
"\tldr r0, [r4, 0x8]\n"
"\tmovs r0, 0\n"
"\tbl ResetBgsAndClearDma3BusyFlags\n"
"\tldr r1, =gUnknown_08618108\n"
"\tmovs r0, 0\n"
"\tmovs r2, 0x2\n"
"\tbl InitBgsFromTemplates\n"
"\tmovs r0, 0\n"
"\tmovs r1, 0\n"
"\tmovs r2, 0\n"
"\tbl ChangeBgX\n"
"\tmovs r0, 0\n"
"\tmovs r1, 0\n"
"\tmovs r2, 0\n"
"\tbl ChangeBgY\n"
"\tmovs r0, 0x1\n"
"\tmovs r1, 0\n"
"\tmovs r2, 0\n"
"\tbl ChangeBgX\n"
"\tmovs r0, 0x1\n"
"\tmovs r1, 0\n"
"\tmovs r2, 0\n"
"\tbl ChangeBgY\n"
"\tldr r0, =gUnknown_08618110\n"
"\tbl InitWindows\n"
"\tbl DeactivateAllTextPrinters\n"
"\tldr r0, =gUnknown_08618138\n"
"\tstr r0, [r4]\n"
"\tldr r0, =0x050001e0\n"
"\tstr r0, [r4, 0x4]\n"
"\tldr r0, =0x84000008\n"
"\tstr r0, [r4, 0x8]\n"
"\tldr r0, [r4, 0x8]\n"
"\tmovs r0, 0\n"
"\tmovs r1, 0x40\n"
"\tbl SetGpuReg\n"
"\tmovs r0, 0x2\n"
"\tmovs r1, 0\n"
"\tbl FillWindowPixelBuffer\n"
"\tmovs r0, 0x3\n"
"\tmovs r1, 0\n"
"\tbl FillWindowPixelBuffer\n"
"\tmovs r0, 0\n"
"\tmovs r1, 0xAA\n"
"\tbl FillWindowPixelBuffer\n"
"\tldr r5, =gUnknown_08617E9B\n"
"\tmovs r0, 0\n"
"\tadds r1, r5, 0\n"
"\tmovs r2, 0\n"
"\tbl GetStringWidth\n"
"\tadds r1, r0, 0\n"
"\tmovs r4, 0x78\n"
"\tsubs r0, r4, r1\n"
"\tlsrs r1, r0, 31\n"
"\tadds r0, r1\n"
"\tasrs r0, 1\n"
"\tlsls r2, r0, 24\n"
"\tlsrs r2, 24\n"
"\tldr r6, =gUnknown_0861815B\n"
"\tstr r6, [sp]\n"
"\tmovs r0, 0x1\n"
"\tnegs r0, r0\n"
"\tmov r8, r0\n"
"\tstr r0, [sp, 0x4]\n"
"\tstr r5, [sp, 0x8]\n"
"\tmovs r0, 0x2\n"
"\tmovs r1, 0\n"
"\tmovs r3, 0x3\n"
"\tbl box_print\n"
"\tldr r5, =gUnknown_08617E8D\n"
"\tmovs r0, 0\n"
"\tadds r1, r5, 0\n"
"\tmovs r2, 0\n"
"\tbl GetStringWidth\n"
"\tadds r1, r0, 0\n"
"\tsubs r4, r1\n"
"\tlsrs r0, r4, 31\n"
"\tadds r4, r0\n"
"\tasrs r4, 1\n"
"\tadds r0, r4, 0\n"
"\tadds r0, 0x78\n"
"\tlsls r2, r0, 24\n"
"\tlsrs r2, 24\n"
"\tstr r6, [sp]\n"
"\tmov r0, r8\n"
"\tstr r0, [sp, 0x4]\n"
"\tstr r5, [sp, 0x8]\n"
"\tmovs r0, 0x2\n"
"\tmovs r1, 0\n"
"\tmovs r3, 0x3\n"
"\tbl box_print\n"
"\tmovs r0, 0\n"
"\tadds r1, r5, 0\n"
"\tmovs r2, 0\n"
"\tbl GetStringWidth\n"
"\tadds r1, r0, 0\n"
"\tmovs r0, 0x70\n"
"\tsubs r0, r1\n"
"\tlsrs r1, r0, 31\n"
"\tadds r0, r1\n"
"\tasrs r0, 1\n"
"\tlsls r2, r0, 24\n"
"\tlsrs r2, 24\n"
"\tstr r6, [sp]\n"
"\tmov r0, r8\n"
"\tstr r0, [sp, 0x4]\n"
"\tstr r5, [sp, 0x8]\n"
"\tmovs r0, 0x3\n"
"\tmovs r1, 0\n"
"\tmovs r3, 0\n"
"\tbl box_print\n"
"\tldr r4, =gUnknown_08617E78\n"
"\tmovs r0, 0x1\n"
"\tadds r1, r4, 0\n"
"\tmovs r2, 0\n"
"\tbl GetStringWidth\n"
"\tadds r1, r0, 0\n"
"\tmovs r0, 0xD0\n"
"\tsubs r0, r1\n"
"\tlsrs r1, r0, 31\n"
"\tadds r0, r1\n"
"\tasrs r0, 1\n"
"\tlsls r2, r0, 24\n"
"\tlsrs r2, 24\n"
"\tldr r0, =gUnknown_08618158\n"
"\tstr r0, [sp]\n"
"\tmov r0, r8\n"
"\tstr r0, [sp, 0x4]\n"
"\tstr r4, [sp, 0x8]\n"
"\tmovs r0, 0\n"
"\tmovs r1, 0x1\n"
"\tmovs r3, 0x2\n"
"\tbl box_print\n"
"\tmovs r0, 0x2\n"
"\tmovs r1, 0x2\n"
"\tbl CopyWindowToVram\n"
"\tmovs r0, 0x3\n"
"\tmovs r1, 0x2\n"
"\tbl CopyWindowToVram\n"
"\tmovs r0, 0\n"
"\tmovs r1, 0x2\n"
"\tbl CopyWindowToVram\n"
"\tadd sp, 0x10\n"
"\tpop {r3}\n"
"\tmov r8, r3\n"
"\tpop {r4-r6}\n"
"\tpop {r0}\n"
"\tbx r0\n"
"\t.pool\n"
".syntax divided");
}
#endif
static int berry_fix_text_update(int checkval)
{
if (berry_fix_mb_manager->unk1 == checkval)
@@ -497,7 +292,7 @@ static void berry_fix_text_print(int scene)
{
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 32, 32);
FillWindowPixelBuffer(1, 0xAA);
box_print(1, 1, 0, 0, gUnknown_08618158, -1, gUnknown_08618160[scene]);
box_print(1, 1, 0, 0, sUnknown_08618158, -1, gUnknown_08618160[scene]);
PutWindowTilemap(1);
CopyWindowToVram(1, 2);
switch (scene)
@@ -523,7 +318,7 @@ static void berry_fix_text_print(int scene)
ShowBg(1);
}
static void berry_fix_bg_hide()
static void berry_fix_bg_hide(void)
{
HideBg(0);
HideBg(1);
+653
View File
@@ -0,0 +1,653 @@
#include "global.h"
#include "berry_tag_screen.h"
#include "berry.h"
#include "decompress.h"
#include "field_map_obj.h"
#include "item_menu.h"
#include "constants/items.h"
#include "item.h"
#include "item_use.h"
#include "main.h"
#include "menu.h"
#include "text.h"
#include "window.h"
#include "task.h"
#include "menu_helpers.h"
#include "palette.h"
#include "overworld.h"
#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
#include "string_util.h"
#include "strings.h"
#include "bg.h"
#include "malloc.h"
#include "scanline_effect.h"
#include "gpu_regs.h"
#include "graphics.h"
#include "item_menu_icons.h"
#include "decompress.h"
#include "international_string_util.h"
// There are 4 windows used in berry tag screen.
enum
{
WIN_BERRY_NAME,
WIN_SIZE_FIRM,
WIN_DESC,
WIN_BERRY_TAG
};
struct BerryTagScreenStruct
{
u16 tilemapBuffers[3][0x400];
u16 berryId;
u8 berrySpriteId;
u8 flavorCircleIds[FLAVOR_COUNT];
u16 gfxState;
};
// EWRAM vars
static EWRAM_DATA struct BerryTagScreenStruct *sBerryTag = NULL;
// const rom data
static const struct BgTemplate sBackgroundTemplates[] =
{
{
.bg = 0,
.charBaseIndex = 0,
.mapBaseIndex = 31,
.screenSize = 0,
.paletteMode = 0,
.priority = 0,
.baseTile = 0
},
{
.bg = 1,
.charBaseIndex = 0,
.mapBaseIndex = 30,
.screenSize = 0,
.paletteMode = 0,
.priority = 1,
.baseTile = 0
},
{
.bg = 2,
.charBaseIndex = 0,
.mapBaseIndex = 29,
.screenSize = 0,
.paletteMode = 0,
.priority = 2,
.baseTile = 0
},
{
.bg = 3,
.charBaseIndex = 0,
.mapBaseIndex = 28,
.screenSize = 0,
.paletteMode = 0,
.priority = 3,
.baseTile = 0
}
};
static const u16 sFontPalette[] = INCBIN_U16("graphics/interface/berry_tag_screen.gbapal");
static const u8 sTextColors[2][3] =
{
{0, 2, 3},
{15, 14, 13}
};
static const struct WindowTemplate sWindowTemplates[] =
{
{0x01, 0x0b, 0x04, 0x08, 0x02, 0x0f, 0x0045}, // WIN_BERRY_NAME
{0x01, 0x0b, 0x07, 0x12, 0x04, 0x0f, 0x0055}, // WIN_SIZE_FIRM
{0x01, 0x04, 0x0e, 0x19, 0x04, 0x0f, 0x009d}, // WIN_DESC
{0x00, 0x02, 0x00, 0x08, 0x02, 0x0f, 0x0101}, // WIN_BERRY_TAG
DUMMY_WIN_TEMPLATE
};
static const u8 *const sBerryFirmnessStrings[] =
{
gBerryFirmnessString_VerySoft,
gBerryFirmnessString_Soft,
gBerryFirmnessString_Hard,
gBerryFirmnessString_VeryHard,
gBerryFirmnessString_SuperHard
};
// this file's functions
static void CB2_InitBerryTagScreen(void);
static void HandleInitBackgrounds(void);
static void HandleInitWindows(void);
static void AddBerryTagTextToBg0(void);
static void PrintAllBerryData(void);
static void CreateBerrySprite(void);
static void CreateFlavorCircleSprites(void);
static void SetFlavorCirclesVisiblity(void);
static void PrintBerryNumberAndName(void);
static void PrintBerrySize(void);
static void PrintBerryFirmness(void);
static void PrintBerryDescription1(void);
static void PrintBerryDescription2(void);
static bool8 InitBerryTagScreen(void);
static bool8 LoadBerryTagGfx(void);
static void Task_HandleInput(u8 taskId);
static void Task_CloseBerryTagScreen(u8 taskId);
static void Task_DisplayAnotherBerry(u8 taskId);
static void TryChangeDisplayedBerry(u8 taskId, s8 toMove);
static void HandleBagCursorPositionChange(s8 toMove);
// code
void DoBerryTagScreen(void)
{
sBerryTag = AllocZeroed(sizeof(*sBerryTag));
sBerryTag->berryId = ItemIdToBerryType(gSpecialVar_ItemId);
SetMainCallback2(CB2_InitBerryTagScreen);
}
static void CB2_BerryTagScreen(void)
{
RunTasks();
AnimateSprites();
BuildOamBuffer();
do_scheduled_bg_tilemap_copies_to_vram();
UpdatePaletteFade();
}
static void VblankCB(void)
{
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
}
static void CB2_InitBerryTagScreen(void)
{
while (1)
{
if (sub_81221EC() == TRUE)
break;
if (InitBerryTagScreen() == TRUE)
break;
if (sub_81221AC() == TRUE)
break;
}
}
static bool8 InitBerryTagScreen(void)
{
switch (gMain.state)
{
case 0:
SetVBlankHBlankCallbacksToNull();
ResetVramOamAndBgCntRegs();
clear_scheduled_bg_copies_to_vram();
gMain.state++;
break;
case 1:
ScanlineEffect_Stop();
gMain.state++;
break;
case 2:
ResetPaletteFade();
gPaletteFade.bufferTransferDisabled = 1;
gMain.state++;
break;
case 3:
ResetSpriteData();
gMain.state++;
break;
case 4:
FreeAllSpritePalettes();
gMain.state++;
break;
case 5:
if (!sub_81221AC())
ResetTasks();
gMain.state++;
break;
case 6:
HandleInitBackgrounds();
sBerryTag->gfxState = 0;
gMain.state++;
break;
case 7:
if (LoadBerryTagGfx())
gMain.state++;
break;
case 8:
HandleInitWindows();
gMain.state++;
break;
case 9:
AddBerryTagTextToBg0();
gMain.state++;
break;
case 10:
PrintAllBerryData();
gMain.state++;
break;
case 11:
CreateBerrySprite();
gMain.state++;
break;
case 12:
CreateFlavorCircleSprites();
SetFlavorCirclesVisiblity();
gMain.state++;
break;
case 13:
CreateTask(Task_HandleInput, 0);
gMain.state++;
break;
case 14:
BlendPalettes(-1, 0x10, 0);
gMain.state++;
break;
case 15:
BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
gPaletteFade.bufferTransferDisabled = 0;
gMain.state++;
break;
default: // done
SetVBlankCallback(VblankCB);
SetMainCallback2(CB2_BerryTagScreen);
return TRUE;
}
return FALSE;
}
static void HandleInitBackgrounds(void)
{
ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(0, sBackgroundTemplates, ARRAY_COUNT(sBackgroundTemplates));
SetBgTilemapBuffer(2, sBerryTag->tilemapBuffers[0]);
SetBgTilemapBuffer(3, sBerryTag->tilemapBuffers[1]);
ResetAllBgsCoordinates();
schedule_bg_copy_tilemap_to_vram(2);
schedule_bg_copy_tilemap_to_vram(3);
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
SetGpuReg(REG_OFFSET_BLDCNT, 0);
ShowBg(0);
ShowBg(1);
ShowBg(2);
ShowBg(3);
}
static bool8 LoadBerryTagGfx(void)
{
u16 i;
switch (sBerryTag->gfxState)
{
case 0:
reset_temp_tile_data_buffers();
decompress_and_copy_tile_data_to_vram(2, gUnknown_08D9BB44, 0, 0, 0);
sBerryTag->gfxState++;
break;
case 1:
if (free_temp_tile_data_buffers_if_possible() != TRUE)
{
LZDecompressWram(gUnknown_08D9BF98, sBerryTag->tilemapBuffers[0]);
sBerryTag->gfxState++;
}
break;
case 2:
LZDecompressWram(gUnknown_08D9C13C, sBerryTag->tilemapBuffers[2]);
sBerryTag->gfxState++;
break;
case 3:
if (gSaveBlock2Ptr->playerGender == MALE)
{
for (i = 0; i < ARRAY_COUNT(sBerryTag->tilemapBuffers[1]); i++)
sBerryTag->tilemapBuffers[1][i] = 0x4042;
}
else
{
for (i = 0; i < ARRAY_COUNT(sBerryTag->tilemapBuffers[1]); i++)
sBerryTag->tilemapBuffers[1][i] = 0x5042;
}
sBerryTag->gfxState++;
break;
case 4:
LoadCompressedPalette(gUnknown_08D9BEF0, 0, 0xC0);
sBerryTag->gfxState++;
break;
case 5:
LoadCompressedObjectPic(&gUnknown_0857FDEC);
sBerryTag->gfxState++;
break;
default:
LoadCompressedObjectPalette(&gUnknown_0857FDF4);
return TRUE; // done
}
return FALSE;
}
static void HandleInitWindows(void)
{
u16 i;
InitWindows(sWindowTemplates);
DeactivateAllTextPrinters();
LoadPalette(sFontPalette, 0xF0, 0x20);
for (i = 0; i < ARRAY_COUNT(sWindowTemplates) - 1; i++)
PutWindowTilemap(i);
schedule_bg_copy_tilemap_to_vram(0);
schedule_bg_copy_tilemap_to_vram(1);
}
static void PrintTextInBerryTagScreen(u8 windowId, const u8 *text, u8 x, u8 y, s32 speed, u8 colorStructId)
{
AddTextPrinterParameterized2(windowId, 1, x, y, 0, 0, sTextColors[colorStructId], speed, text);
}
static void AddBerryTagTextToBg0(void)
{
memcpy(GetBgTilemapBuffer(0), sBerryTag->tilemapBuffers[2], sizeof(sBerryTag->tilemapBuffers[2]));
FillWindowPixelBuffer(WIN_BERRY_TAG, 0xFF);
PrintTextInBerryTagScreen(WIN_BERRY_TAG, gText_BerryTag, GetStringCenterAlignXOffset(1, gText_BerryTag, 0x40), 1, 0, 1);
PutWindowTilemap(WIN_BERRY_TAG);
schedule_bg_copy_tilemap_to_vram(0);
}
static void PrintAllBerryData(void)
{
PrintBerryNumberAndName();
PrintBerrySize();
PrintBerryFirmness();
PrintBerryDescription1();
PrintBerryDescription2();
}
static void PrintBerryNumberAndName(void)
{
const struct Berry *berry = GetBerryInfo(sBerryTag->berryId);
ConvertIntToDecimalStringN(gStringVar1, sBerryTag->berryId, 2, 2);
StringCopy(gStringVar2, berry->name);
StringExpandPlaceholders(gStringVar4, gText_UnkF908Var1Var2);
PrintTextInBerryTagScreen(WIN_BERRY_NAME, gStringVar4, 0, 1, 0, 0);
}
static void PrintBerrySize(void)
{
const struct Berry *berry = GetBerryInfo(sBerryTag->berryId);
PrintTextOnWindow(WIN_SIZE_FIRM, 1, gText_SizeSlash, 0, 1, TEXT_SPEED_FF, NULL);
if (berry->size != 0)
{
u32 inches, fraction;
inches = 1000 * berry->size / 254;
if (inches % 10 > 4)
inches += 10;
fraction = (inches % 100) / 10;
inches /= 100;
ConvertIntToDecimalStringN(gStringVar1, inches, 0, 2);
ConvertIntToDecimalStringN(gStringVar2, fraction, 0, 2);
StringExpandPlaceholders(gStringVar4, gText_Var1DotVar2);
PrintTextOnWindow(WIN_SIZE_FIRM, 1, gStringVar4, 0x28, 1, 0, NULL);
}
else
{
PrintTextOnWindow(WIN_SIZE_FIRM, 1, gText_ThreeMarks, 0x28, 1, 0, NULL);
}
}
static void PrintBerryFirmness(void)
{
const struct Berry *berry = GetBerryInfo(sBerryTag->berryId);
PrintTextOnWindow(WIN_SIZE_FIRM, 1, gText_FirmSlash, 0, 0x11, TEXT_SPEED_FF, NULL);
if (berry->firmness != 0)
PrintTextOnWindow(WIN_SIZE_FIRM, 1, sBerryFirmnessStrings[berry->firmness - 1], 0x28, 0x11, 0, NULL);
else
PrintTextOnWindow(WIN_SIZE_FIRM, 1, gText_ThreeMarks, 0x28, 0x11, 0, NULL);
}
static void PrintBerryDescription1(void)
{
const struct Berry *berry = GetBerryInfo(sBerryTag->berryId);
PrintTextOnWindow(WIN_DESC, 1, berry->description1, 0, 1, 0, NULL);
}
static void PrintBerryDescription2(void)
{
const struct Berry *berry = GetBerryInfo(sBerryTag->berryId);
PrintTextOnWindow(WIN_DESC, 1, berry->description2, 0, 0x11, 0, NULL);
}
static void CreateBerrySprite(void)
{
sBerryTag->berrySpriteId = CreateBerryTagSprite(sBerryTag->berryId - 1, 56, 64);
}
static void DestroyBerrySprite(void)
{
DestroySprite(&gSprites[sBerryTag->berrySpriteId]);
FreeBerryTagSpritePalette();
}
static void CreateFlavorCircleSprites(void)
{
sBerryTag->flavorCircleIds[FLAVOR_SPICY] = CreateBerryFlavorCircleSprite(64);
sBerryTag->flavorCircleIds[FLAVOR_DRY] = CreateBerryFlavorCircleSprite(104);
sBerryTag->flavorCircleIds[FLAVOR_SWEET] = CreateBerryFlavorCircleSprite(144);
sBerryTag->flavorCircleIds[FLAVOR_BITTER] = CreateBerryFlavorCircleSprite(184);
sBerryTag->flavorCircleIds[FLAVOR_SOUR] = CreateBerryFlavorCircleSprite(224);
}
static void SetFlavorCirclesVisiblity(void)
{
const struct Berry *berry = GetBerryInfo(sBerryTag->berryId);
if (berry->spicy)
gSprites[sBerryTag->flavorCircleIds[FLAVOR_SPICY]].invisible = 0;
else
gSprites[sBerryTag->flavorCircleIds[FLAVOR_SPICY]].invisible = 1;
if (berry->dry)
gSprites[sBerryTag->flavorCircleIds[FLAVOR_DRY]].invisible = 0;
else
gSprites[sBerryTag->flavorCircleIds[FLAVOR_DRY]].invisible = 1;
if (berry->sweet)
gSprites[sBerryTag->flavorCircleIds[FLAVOR_SWEET]].invisible = 0;
else
gSprites[sBerryTag->flavorCircleIds[FLAVOR_SWEET]].invisible = 1;
if (berry->bitter)
gSprites[sBerryTag->flavorCircleIds[FLAVOR_BITTER]].invisible = 0;
else
gSprites[sBerryTag->flavorCircleIds[FLAVOR_BITTER]].invisible = 1;
if (berry->sour)
gSprites[sBerryTag->flavorCircleIds[FLAVOR_SOUR]].invisible = 0;
else
gSprites[sBerryTag->flavorCircleIds[FLAVOR_SOUR]].invisible = 1;
}
static void DestroyFlavorCircleSprites(void)
{
u16 i;
for (i = 0; i < FLAVOR_COUNT; i++)
DestroySprite(&gSprites[sBerryTag->flavorCircleIds[i]]);
}
static void PrepareToCloseBerryTagScreen(u8 taskId)
{
PlaySE(SE_SELECT);
BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
gTasks[taskId].func = Task_CloseBerryTagScreen;
}
static void Task_CloseBerryTagScreen(u8 taskId)
{
if (!gPaletteFade.active)
{
DestroyBerrySprite();
DestroyFlavorCircleSprites();
Free(sBerryTag);
FreeAllWindowBuffers();
SetMainCallback2(bag_menu_mail_related);
DestroyTask(taskId);
}
}
static void Task_HandleInput(u8 taskId)
{
if (!gPaletteFade.active)
{
u16 arrowKeys = gMain.newAndRepeatedKeys & DPAD_ANY;
if (arrowKeys == DPAD_UP)
TryChangeDisplayedBerry(taskId, -1);
else if (arrowKeys == DPAD_DOWN)
TryChangeDisplayedBerry(taskId, 1);
else if (gMain.newKeys & (A_BUTTON | B_BUTTON))
PrepareToCloseBerryTagScreen(taskId);
}
}
static void TryChangeDisplayedBerry(u8 taskId, s8 toMove)
{
s16 *data = gTasks[taskId].data;
s16 currPocketPosition = gUnknown_0203CE58.unk12[3] + gUnknown_0203CE58.unk8[3];
u32 newPocketPosition = currPocketPosition + toMove;
if (newPocketPosition < 46 && BagGetItemIdByPocketPosition(BAG_BERRIES, newPocketPosition) != 0)
{
if (toMove < 0)
data[1] = 2;
else
data[1] = 1;
data[0] = 0;
PlaySE(SE_SELECT);
HandleBagCursorPositionChange(toMove);
gTasks[taskId].func = Task_DisplayAnotherBerry;
}
}
static void HandleBagCursorPositionChange(s8 toMove)
{
u16 *scrollPos = &gUnknown_0203CE58.unk12[3];
u16 *cursorPos = &gUnknown_0203CE58.unk8[3];
if (toMove > 0)
{
if (*cursorPos < 4 || BagGetItemIdByPocketPosition(BAG_BERRIES, *scrollPos + 8) == 0)
*cursorPos += toMove;
else
*scrollPos += toMove;
}
else
{
if (*cursorPos > 3 || *scrollPos == 0)
*cursorPos += toMove;
else
*scrollPos += toMove;
}
sBerryTag->berryId = ItemIdToBerryType(BagGetItemIdByPocketPosition(BAG_BERRIES, *scrollPos + *cursorPos));
}
static void Task_DisplayAnotherBerry(u8 taskId)
{
u16 i;
s16 posY;
s16 *data = gTasks[taskId].data;
data[0] += 0x10;
data[0] &= 0xFF;
if (data[1] == 1)
{
switch (data[0])
{
case 0x30:
FillWindowPixelBuffer(0, 0);
break;
case 0x40:
PrintBerryNumberAndName();
break;
case 0x50:
DestroyBerrySprite();
CreateBerrySprite();
break;
case 0x60:
FillWindowPixelBuffer(1, 0);
break;
case 0x70:
PrintBerrySize();
break;
case 0x80:
PrintBerryFirmness();
break;
case 0x90:
SetFlavorCirclesVisiblity();
break;
case 0xA0:
FillWindowPixelBuffer(2, 0);
break;
case 0xB0:
PrintBerryDescription1();
break;
case 0xC0:
PrintBerryDescription2();
break;
}
}
else
{
switch (data[0])
{
case 0x30:
FillWindowPixelBuffer(2, 0);
break;
case 0x40:
PrintBerryDescription2();
break;
case 0x50:
PrintBerryDescription1();
break;
case 0x60:
SetFlavorCirclesVisiblity();
break;
case 0x70:
FillWindowPixelBuffer(1, 0);
break;
case 0x80:
PrintBerryFirmness();
break;
case 0x90:
PrintBerrySize();
break;
case 0xA0:
DestroyBerrySprite();
CreateBerrySprite();
break;
case 0xB0:
FillWindowPixelBuffer(0, 0);
break;
case 0xC0:
PrintBerryNumberAndName();
break;
}
}
if (data[1] == 1)
posY = -data[0];
else
posY = data[0];
gSprites[sBerryTag->berrySpriteId].pos2.y = posY;
for (i = 0; i < FLAVOR_COUNT; i++)
gSprites[sBerryTag->flavorCircleIds[i]].pos2.y = posY;
ChangeBgY(1, 0x1000, data[1]);
ChangeBgY(2, 0x1000, data[1]);
if (data[0] == 0)
gTasks[taskId].func = Task_HandleInput;
}
+2 -2
View File
@@ -1007,7 +1007,7 @@ void CopyToBgTilemapBufferRect_ChangePalette(u8 bg, void *src, u8 destX, u8 dest
}
// Skipping for now, it probably uses structs passed by value
/*
void CopyRectToBgTilemapBufferRect(u8 bg, void* src, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette1, u16 tileOffset, u16 palette2)
void CopyRectToBgTilemapBufferRect(u8 bg, const void* src, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette1, u16 tileOffset, u16 palette2)
{
u16 attribute;
u16 mode;
@@ -1049,7 +1049,7 @@ void CopyRectToBgTilemapBufferRect(u8 bg, void* src, u8 srcX, u8 srcY, u8 srcWid
}
}*/
__attribute__((naked))
void CopyRectToBgTilemapBufferRect(u8 bg, void* src, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette1, u16 tileOffset, u16 palette2)
void CopyRectToBgTilemapBufferRect(u8 bg, const void* src, u8 srcX, u8 srcY, u8 srcWidth, u8 srcHeight, u8 destX, u8 destY, u8 rectWidth, u8 rectHeight, u8 palette1, u16 tileOffset, u16 palette2)
{
asm("push {r4-r7,lr}\n\
mov r7, r10\n\
+1078
View File
File diff suppressed because it is too large Load Diff
Executable → Regular
+18 -18
View File
@@ -1,19 +1,19 @@
#include "global.h"
#include "event_data.h"
#include "songs.h"
#include "constants/songs.h"
#include "sound.h"
#include "script.h"
#include "species.h"
#include "constants/species.h"
#include "task.h"
#include "field_effect.h"
#include "flags.h"
#include "constants/flags.h"
extern void MapGridSetMetatileIdAt(s32 x, s32 y, u16 metatileId); // fieldmap
extern void DrawWholeMapView(); // field_camera
extern void SetCameraPanningCallback(void ( *callback)()); // field_camera
extern void InstallCameraPanAheadCallback(void);
extern void SetCameraPanning(s16 x, s16 y);
extern u8 brm_get_pokemon_selection(void);
extern u8 GetCursorSelectionMonId(void);
extern void FieldEffectActiveListRemove(u8 id); // field_effect
extern u8 oei_task_add(void);
@@ -33,7 +33,7 @@ void sub_8179944(void);
bool8 ShouldDoBrailleDigEffect(void)
{
if (!FlagGet(SYS_BRAILLE_DIG)
if (!FlagGet(FLAG_SYS_BRAILLE_DIG)
&& (gSaveBlock1Ptr->location.mapGroup == 0x18
&& gSaveBlock1Ptr->location.mapNum == 0x47))
{
@@ -58,7 +58,7 @@ void DoBrailleDigEffect(void)
MapGridSetMetatileIdAt(18, 9, 3636);
DrawWholeMapView();
PlaySE(SE_BAN);
FlagSet(SYS_BRAILLE_DIG);
FlagSet(FLAG_SYS_BRAILLE_DIG);
ScriptContext2_Disable();
}
@@ -81,7 +81,7 @@ bool8 CheckRelicanthWailord(void)
void ShouldDoBrailleStrengthEffectOld(void)
{
/*
if (!FlagGet(SYS_BRAILLE_STRENGTH) && (gSaveBlock1.location.mapGroup == MAP_GROUP_DESERT_RUINS && gSaveBlock1.location.mapNum == MAP_ID_DESERT_RUINS))
if (!FlagGet(FLAG_SYS_BRAILLE_STRENGTH) && (gSaveBlock1.location.mapGroup == MAP_GROUP_DESERT_RUINS && gSaveBlock1.location.mapNum == MAP_ID_DESERT_RUINS))
{
if (gSaveBlock1.pos.x == 10 && gSaveBlock1.pos.y == 23)
return TRUE;
@@ -105,13 +105,13 @@ void DoBrailleStrengthEffect(void)
MapGridSetMetatileIdAt(16, 27, 3636);
DrawWholeMapView();
PlaySE(SE_BAN);
FlagSet(SYS_BRAILLE_STRENGTH);
FlagSet(FLAG_SYS_BRAILLE_STRENGTH);
ScriptContext2_Disable();
}
bool8 ShouldDoBrailleFlyEffect(void)
{
if (!FlagGet(SYS_BRAILLE_FLY) && (gSaveBlock1.location.mapGroup == MAP_GROUP_ANCIENT_TOMB && gSaveBlock1.location.mapNum == MAP_ID_ANCIENT_TOMB))
if (!FlagGet(FLAG_SYS_BRAILLE_FLY) && (gSaveBlock1.location.mapGroup == MAP_GROUP_ANCIENT_TOMB && gSaveBlock1.location.mapNum == MAP_ID_ANCIENT_TOMB))
{
if (gSaveBlock1.pos.x == 8 && gSaveBlock1.pos.y == 25)
return TRUE;
@@ -151,7 +151,7 @@ void UseFlyAncientTomb_Finish(void)
MapGridSetMetatileIdAt(16, 27, 3636);
DrawWholeMapView();
PlaySE(SE_BAN);
FlagSet(SYS_BRAILLE_FLY);
FlagSet(FLAG_SYS_BRAILLE_FLY);
ScriptContext2_Disable();
}
*/
@@ -205,7 +205,7 @@ void SealedChamberShakingEffect(u8 taskId)
// moved later in the function because it was rewritten.
bool8 ShouldDoBrailleStrengthEffect(void)
{
if (!FlagGet(SYS_BRAILLE_STRENGTH) && (gSaveBlock1Ptr->location.mapGroup == 0x18 && gSaveBlock1Ptr->location.mapNum == 0x06))
if (!FlagGet(FLAG_SYS_BRAILLE_STRENGTH) && (gSaveBlock1Ptr->location.mapGroup == 0x18 && gSaveBlock1Ptr->location.mapNum == 0x06))
{
if (gSaveBlock1Ptr->pos.x == 6 && gSaveBlock1Ptr->pos.y == 23)
{ gBraillePuzzleCallbackFlag = STRENGTH_PUZZLE; return TRUE; }
@@ -220,7 +220,7 @@ bool8 ShouldDoBrailleStrengthEffect(void)
void sub_8179834(void)
{
gFieldEffectArguments[0] = brm_get_pokemon_selection();
gFieldEffectArguments[0] = GetCursorSelectionMonId();
FieldEffectStart(FLDEFF_USE_FLY_ANCIENT_TOMB);
}
@@ -240,13 +240,13 @@ void sub_8179860(void)
MapGridSetMetatileIdAt(16, 27, 3636);
DrawWholeMapView();
PlaySE(SE_BAN);
FlagSet(SYS_BRAILLE_STRENGTH);
FlagSet(FLAG_SYS_BRAILLE_STRENGTH);
ScriptContext2_Disable();
}
bool8 ShouldDoBrailleFlyEffect(void)
{
if (!FlagGet(SYS_BRAILLE_FLY) && (gSaveBlock1Ptr->location.mapGroup == 0x18 && gSaveBlock1Ptr->location.mapNum == 0x44))
if (!FlagGet(FLAG_SYS_BRAILLE_FLY) && (gSaveBlock1Ptr->location.mapGroup == 0x18 && gSaveBlock1Ptr->location.mapNum == 0x44))
{
if (gSaveBlock1Ptr->pos.x == 8 && gSaveBlock1Ptr->pos.y == 25)
{ gBraillePuzzleCallbackFlag = FLY_PUZZLE; return TRUE; }
@@ -256,7 +256,7 @@ bool8 ShouldDoBrailleFlyEffect(void)
void sub_8179918(void)
{
gFieldEffectArguments[0] = brm_get_pokemon_selection();
gFieldEffectArguments[0] = GetCursorSelectionMonId();
FieldEffectStart(FLDEFF_USE_FLY_ANCIENT_TOMB);
}
@@ -276,7 +276,7 @@ void sub_8179944(void)
MapGridSetMetatileIdAt(16, 27, 3636);
DrawWholeMapView();
PlaySE(SE_BAN);
FlagSet(SYS_BRAILLE_FLY);
FlagSet(FLAG_SYS_BRAILLE_FLY);
ScriptContext2_Disable();
}
@@ -284,7 +284,7 @@ void sub_8179944(void)
void DoBrailleWait(void)
{
/*
if (!FlagGet(SYS_BRAILLE_WAIT))
if (!FlagGet(FLAG_SYS_BRAILLE_WAIT))
CreateTask(Task_BrailleWait, 0x50);
}
@@ -387,7 +387,7 @@ bool8 ShouldDoBrailleRegicePuzzle(void)
if (gSaveBlock1Ptr->location.mapGroup == 0x18 && gSaveBlock1Ptr->location.mapNum == 0x43)
{
// _08179A1A
if (FlagGet(SYS_BRAILLE_WAIT) != FALSE)
if (FlagGet(FLAG_SYS_BRAILLE_WAIT) != FALSE)
return FALSE;
if (FlagGet(2) == FALSE)
return FALSE;
+26 -34
View File
@@ -1,23 +1,15 @@
#include "global.h"
#include "abilities.h"
#include "constants/abilities.h"
#include "battle.h"
#include "hold_effects.h"
#include "battle_setup.h"
#include "constants/hold_effects.h"
#include "event_data.h"
#include "item.h"
#include "items.h"
#include "constants/items.h"
#include "pokemon.h"
#include "species.h"
#include "moves.h"
#include "battle_move_effects.h"
extern u32 gBattleTypeFlags;
extern struct BattlePokemon gBattleMons[4];
extern u16 gCurrentMove;
extern u8 gCritMultiplier;
extern u16 gBattleWeather;
extern struct BattleEnigmaBerry gEnigmaBerries[];
extern u16 gBattleMovePower;
extern u16 gTrainerBattleOpponent_A;
#include "constants/species.h"
#include "constants/moves.h"
#include "constants/battle_move_effects.h"
bool8 ShouldGetStatBadgeBoost(u16 flagId, u8 bank);
@@ -84,13 +76,13 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
if (attacker->ability == ABILITY_HUGE_POWER || attacker->ability == ABILITY_PURE_POWER)
attack *= 2;
if (ShouldGetStatBadgeBoost(BADGE01_GET, bankAtk))
if (ShouldGetStatBadgeBoost(FLAG_BADGE01_GET, bankAtk))
attack = (110 * attack) / 100;
if (ShouldGetStatBadgeBoost(BADGE05_GET, bankDef))
if (ShouldGetStatBadgeBoost(FLAG_BADGE05_GET, bankDef))
defense = (110 * defense) / 100;
if (ShouldGetStatBadgeBoost(BADGE07_GET, bankAtk))
if (ShouldGetStatBadgeBoost(FLAG_BADGE07_GET, bankAtk))
spAttack = (110 * spAttack) / 100;
if (ShouldGetStatBadgeBoost(BADGE07_GET, bankDef))
if (ShouldGetStatBadgeBoost(FLAG_BADGE07_GET, bankDef))
spDefense = (110 * spDefense) / 100;
for (i = 0; i < 17; i++)
@@ -149,35 +141,35 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
if (gBattleMoves[gCurrentMove].effect == EFFECT_EXPLOSION)
defense /= 2;
if (type < TYPE_MYSTERY) // is physical
if (IS_MOVE_PHYSICAL(type))
{
if (gCritMultiplier == 2)
{
if (attacker->statStages[STAT_STAGE_ATK] > 6)
APPLY_STAT_MOD(damage, attacker, attack, STAT_STAGE_ATK)
if (attacker->statStages[STAT_ATK] > 6)
APPLY_STAT_MOD(damage, attacker, attack, STAT_ATK)
else
damage = attack;
}
else
APPLY_STAT_MOD(damage, attacker, attack, STAT_STAGE_ATK)
APPLY_STAT_MOD(damage, attacker, attack, STAT_ATK)
damage = damage * gBattleMovePower;
damage *= (2 * attacker->level / 5 + 2);
if (gCritMultiplier == 2)
{
if (defender->statStages[STAT_STAGE_DEF] < 6)
APPLY_STAT_MOD(damageHelper, defender, defense, STAT_STAGE_DEF)
if (defender->statStages[STAT_DEF] < 6)
APPLY_STAT_MOD(damageHelper, defender, defense, STAT_DEF)
else
damageHelper = defense;
}
else
APPLY_STAT_MOD(damageHelper, defender, defense, STAT_STAGE_DEF)
APPLY_STAT_MOD(damageHelper, defender, defense, STAT_DEF)
damage = damage / damageHelper;
damage /= 50;
if ((attacker->status1 & STATUS_BURN) && attacker->ability != ABILITY_GUTS)
if ((attacker->status1 & STATUS1_BURN) && attacker->ability != ABILITY_GUTS)
damage /= 2;
if ((sideStatus & SIDE_STATUS_REFLECT) && gCritMultiplier == 1)
@@ -199,30 +191,30 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de
if (type == TYPE_MYSTERY)
damage = 0; // is ??? type. does 0 damage.
if (type > TYPE_MYSTERY) // is special?
if (IS_MOVE_SPECIAL(type))
{
if (gCritMultiplier == 2)
{
if (attacker->statStages[STAT_STAGE_SPATK] > 6)
APPLY_STAT_MOD(damage, attacker, spAttack, STAT_STAGE_SPATK)
if (attacker->statStages[STAT_SPATK] > 6)
APPLY_STAT_MOD(damage, attacker, spAttack, STAT_SPATK)
else
damage = spAttack;
}
else
APPLY_STAT_MOD(damage, attacker, spAttack, STAT_STAGE_SPATK)
APPLY_STAT_MOD(damage, attacker, spAttack, STAT_SPATK)
damage = damage * gBattleMovePower;
damage *= (2 * attacker->level / 5 + 2);
if (gCritMultiplier == 2)
{
if (defender->statStages[STAT_STAGE_SPDEF] < 6)
APPLY_STAT_MOD(damageHelper, defender, spDefense, STAT_STAGE_SPDEF)
if (defender->statStages[STAT_SPDEF] < 6)
APPLY_STAT_MOD(damageHelper, defender, spDefense, STAT_SPDEF)
else
damageHelper = spDefense;
}
else
APPLY_STAT_MOD(damageHelper, defender, spDefense, STAT_STAGE_SPDEF)
APPLY_STAT_MOD(damageHelper, defender, spDefense, STAT_SPDEF)
damage = (damage / damageHelper);
damage /= 50;
Executable → Regular
+3 -3
View File
@@ -1,7 +1,7 @@
#include "global.h"
#include "task.h"
#include "menu.h"
#include "text.h"
#include "menu.h"
#include "sound.h"
#include "main.h"
#include "save.h"
@@ -9,7 +9,7 @@
#include "gpu_regs.h"
#include "bg.h"
#include "text_window.h"
#include "songs.h"
#include "constants/songs.h"
extern u8 gText_ClearAllSaveData[];
extern u8 gText_ClearingData[];
@@ -88,7 +88,7 @@ static void Task_DoClearSaveDataScreenYesNo(u8 taskId)
static void Task_ClearSaveDataScreenYesNoChoice(u8 taskId)
{
switch(sub_8198C58())
switch(ProcessMenuInputNoWrap_())
{
case 0:
FillWindowPixelBuffer(0, 17);
+93
View File
@@ -0,0 +1,93 @@
#include "global.h"
#include "rom6.h"
#include "event_data.h"
#include "rtc.h"
#include "lottery_corner.h"
#include "dewford_trend.h"
#include "tv.h"
#include "field_screen.h"
#include "berry.h"
#include "main.h"
#include "overworld.h"
#include "wallclock.h"
// static types
// static declarations
static void UpdatePerDay(struct Time *localTime);
static void UpdatePerMinute(struct Time *localTime);
// rodata
// text
static void InitTimeBasedEvents(void)
{
FlagSet(FLAG_SYS_CLOCK_SET);
RtcCalcLocalTime();
gSaveBlock2Ptr->lastBerryTreeUpdate = gLocalTime;
VarSet(VAR_DAYS, gLocalTime.days);
}
void DoTimeBasedEvents(void)
{
if (FlagGet(FLAG_SYS_CLOCK_SET) && !sub_813B9C0())
{
RtcCalcLocalTime();
UpdatePerDay(&gLocalTime);
UpdatePerMinute(&gLocalTime);
}
}
static void UpdatePerDay(struct Time *localTime)
{
u16 *days = GetVarPointer(VAR_DAYS);
u16 daysSince;
if (*days != localTime->days && *days <= localTime->days)
{
daysSince = localTime->days - *days;
ClearUpperFlags();
UpdateDewfordTrendPerDay(daysSince);
UpdateTVShowsPerDay(daysSince);
UpdateWeatherPerDay(daysSince);
UpdatePartyPokerusTime(daysSince);
UpdateMirageRnd(daysSince);
UpdateBirchState(daysSince);
UpdateFrontierManiac(daysSince);
UpdateFrontierGambler(daysSince);
SetShoalItemFlag(daysSince);
SetRandomLotteryNumber(daysSince);
*days = localTime->days;
}
}
static void UpdatePerMinute(struct Time *localTime)
{
struct Time difference;
int minutes;
CalcTimeDifference(&difference, &gSaveBlock2Ptr->lastBerryTreeUpdate, localTime);
minutes = 24 * 60 * difference.days + 60 * difference.hours + difference.minutes;
if (minutes != 0)
{
if (minutes >= 0)
{
BerryTreeTimeUpdate(minutes);
gSaveBlock2Ptr->lastBerryTreeUpdate = *localTime;
}
}
}
static void ReturnFromStartWallClock(void)
{
InitTimeBasedEvents();
SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music);
}
void StartWallClock(void)
{
SetMainCallback2(Cb2_StartWallClock);
gMain.savedCallback = ReturnFromStartWallClock;
}
+17 -10
View File
@@ -2,7 +2,7 @@
#include "coins.h"
#include "text.h"
#include "window.h"
#include "text_window.h"
#include "strings.h"
#include "string_util.h"
#include "menu.h"
#include "international_string_util.h"
@@ -11,10 +11,6 @@
EWRAM_DATA u8 sCoinsWindowId = 0;
extern void sub_819746C(u8 windowId, bool8 copyToVram);
extern const u8 gText_Coins[];
void PrintCoinsString(u32 coinAmount)
{
u32 xAlign;
@@ -53,7 +49,6 @@ void SetCoins(u16 coinAmount)
gSaveBlock1Ptr->coins = coinAmount ^ gSaveBlock2Ptr->encryptionKey;
}
/* Can't match it lol
bool8 GiveCoins(u16 toAdd)
{
u16 newAmount;
@@ -67,10 +62,22 @@ bool8 GiveCoins(u16 toAdd)
}
else
{
newAmount = ownedCoins + toAdd;
if (newAmount > MAX_COINS)
newAmount = MAX_COINS;
ownedCoins += toAdd;
if (ownedCoins > MAX_COINS)
ownedCoins = MAX_COINS;
newAmount = ownedCoins;
}
SetCoins(newAmount);
return TRUE;
}*/
}
bool8 TakeCoins(u16 toSub)
{
u16 ownedCoins = GetCoins();
if (ownedCoins >= toSub)
{
SetCoins(ownedCoins - toSub);
return TRUE;
}
return FALSE;
}
+119
View File
@@ -0,0 +1,119 @@
#include "global.h"
#include "constants/weather.h"
#include "coord_event_weather.h"
#include "field_weather.h"
struct CoordEventWeather
{
u8 coordEventWeather;
void (*func)(void);
};
static void CoordEventWeather_Clouds(void);
static void CoordEventWeather_Sunny(void);
static void CoordEventWeather_LightRain(void);
static void CoordEventWeather_Snow(void);
static void CoordEventWeather_Thunderstorm(void);
static void CoordEventWeather_Fog(void);
static void CoordEventWeather_DiagonalFog(void);
static void CoordEventWeather_Ash(void);
static void CoordEventWeather_Sandstorm(void);
static void CoordEventWeather_Dark(void);
static void CoordEventWeather_Drought(void);
static void CoordEventWeather_Route119Cycle(void);
static void CoordEventWeather_Route123Cycle(void);
static const struct CoordEventWeather sCoordEventWeatherFuncs[] =
{
{ COORD_EVENT_WEATHER_CLOUDS, CoordEventWeather_Clouds },
{ COORD_EVENT_WEATHER_SUNNY, CoordEventWeather_Sunny },
{ COORD_EVENT_WEATHER_RAIN_LIGHT, CoordEventWeather_LightRain },
{ COORD_EVENT_WEATHER_SNOW, CoordEventWeather_Snow },
{ COORD_EVENT_WEATHER_RAIN_MED, CoordEventWeather_Thunderstorm },
{ COORD_EVENT_WEATHER_FOG_1, CoordEventWeather_Fog },
{ COORD_EVENT_WEATHER_FOG_2, CoordEventWeather_DiagonalFog },
{ COORD_EVENT_WEATHER_ASH, CoordEventWeather_Ash },
{ COORD_EVENT_WEATHER_SANDSTORM, CoordEventWeather_Sandstorm },
{ COORD_EVENT_WEATHER_SHADE, CoordEventWeather_Dark },
{ COORD_EVENT_WEATHER_DROUGHT, CoordEventWeather_Drought },
{ COORD_EVENT_WEATHER_ROUTE119_CYCLE, CoordEventWeather_Route119Cycle },
{ COORD_EVENT_WEATHER_ROUTE123_CYCLE, CoordEventWeather_Route123Cycle },
};
static void CoordEventWeather_Clouds(void)
{
SetWeather(WEATHER_CLOUDS);
}
static void CoordEventWeather_Sunny(void)
{
SetWeather(WEATHER_SUNNY);
}
static void CoordEventWeather_LightRain(void)
{
SetWeather(WEATHER_RAIN_LIGHT);
}
static void CoordEventWeather_Snow(void)
{
SetWeather(WEATHER_SNOW);
}
static void CoordEventWeather_Thunderstorm(void)
{
SetWeather(WEATHER_RAIN_MED);
}
static void CoordEventWeather_Fog(void)
{
SetWeather(WEATHER_FOG_1);
}
static void CoordEventWeather_DiagonalFog(void)
{
SetWeather(WEATHER_FOG_2);
}
static void CoordEventWeather_Ash(void)
{
SetWeather(WEATHER_ASH);
}
static void CoordEventWeather_Sandstorm(void)
{
SetWeather(WEATHER_SANDSTORM);
}
static void CoordEventWeather_Dark(void)
{
SetWeather(WEATHER_SHADE);
}
static void CoordEventWeather_Drought(void)
{
SetWeather(WEATHER_DROUGHT);
}
static void CoordEventWeather_Route119Cycle(void)
{
SetWeather(WEATHER_ROUTE119_CYCLE);
}
static void CoordEventWeather_Route123Cycle(void)
{
SetWeather(WEATHER_ROUTE123_CYCLE);
}
void DoCoordEventWeather(u8 coordEventWeather)
{
u8 i;
for (i = 0; i < ARRAY_COUNT(sCoordEventWeatherFuncs); i++)
{
if (sCoordEventWeatherFuncs[i].coordEventWeather == coordEventWeather)
{
sCoordEventWeatherFuncs[i].func();
return;
}
}
}
+1319
View File
File diff suppressed because it is too large Load Diff
+3 -4
View File
@@ -1,6 +1,6 @@
#include "global.h"
#include "decompress.h"
#include "species.h"
#include "constants/species.h"
#include "text.h"
#include "malloc.h"
#include "pokemon.h"
@@ -459,10 +459,9 @@ _08034964:\n\
.syntax divided");
}
u32 sub_8034974(void* ptr)
u32 sub_8034974(const u8 *ptr)
{
u8* ptr_ = (u8*)(ptr);
return (ptr_[3] << 16) | (ptr_[2] << 8) | (ptr_[1]);
return (ptr[3] << 16) | (ptr[2] << 8) | (ptr[1]);
}
bool8 LoadCompressedObjectPicUsingHeap(const struct CompressedSpriteSheet* src)
+89 -89
View File
@@ -1,15 +1,15 @@
// Includes
#include "global.h"
#include "constants/decorations.h"
#include "decompress.h"
#include "malloc.h"
#include "text.h"
#include "string_util.h"
#include "international_string_util.h"
#include "script.h"
#include "task.h"
#include "main.h"
#include "palette.h"
#include "songs.h"
#include "constants/songs.h"
#include "overworld.h"
#include "fieldmap.h"
#include "metatile_behavior.h"
@@ -20,12 +20,12 @@
#include "field_map_obj.h"
#include "list_menu.h"
#include "menu_helpers.h"
#include "new_menu_helpers.h"
#include "menu.h"
#include "menu_indicators.h"
#include "sound.h"
#include "event_scripts.h"
#include "event_data.h"
#include "region_map.h"
#include "constants/region_map_sections.h"
#include "player_pc.h"
#include "strings.h"
#include "tv.h"
@@ -33,7 +33,7 @@
#include "tilesets.h"
#include "item_icon.h"
#include "trader.h"
#include "map_object_constants.h"
#include "constants/map_objects.h"
#include "decoration_inventory.h"
#include "decoration.h"
#include "graphics.h"
@@ -68,27 +68,27 @@ struct DecorRearrangementDataBuffer {
// Static RAM declarations
EWRAM_DATA u8 *gCurDecorInventoryItems = NULL;
EWRAM_DATA u8 sSecretBasePCMenuCursorPos = 0;
EWRAM_DATA u8 sCurDecorCatCount = 0;
EWRAM_DATA u8 sSecretBaseItemsIndicesBuffer[16] = {};
EWRAM_DATA u8 sPlayerRoomItemsIndicesBuffer[12] = {};
EWRAM_DATA u16 sSecretBasePCSelectDecorLineNo = 0;
EWRAM_DATA u16 sSecretBasePCSelectDecorPageNo = 0;
EWRAM_DATA static u8 sSecretBasePCMenuCursorPos = 0;
EWRAM_DATA static u8 sCurDecorCatCount = 0;
EWRAM_DATA static u8 sSecretBaseItemsIndicesBuffer[16] = {};
EWRAM_DATA static u8 sPlayerRoomItemsIndicesBuffer[12] = {};
EWRAM_DATA static u16 sSecretBasePCSelectDecorLineNo = 0;
EWRAM_DATA static u16 sSecretBasePCSelectDecorPageNo = 0;
EWRAM_DATA u8 gCurDecorationIndex = 0;
EWRAM_DATA u8 sCurDecorationCategory = DECORCAT_DESK;
EWRAM_DATA u32 filler_0203a174[2] = {};
EWRAM_DATA static u8 sCurDecorationCategory = DECORCAT_DESK;
EWRAM_DATA static u32 filler_0203a174[2] = {};
EWRAM_DATA struct DecorPCPointers gUnknown_0203A17C = {};
EWRAM_DATA u8 sDecorMenuWindowIndices[4] = {};
EWRAM_DATA static u8 sDecorMenuWindowIndices[4] = {};
EWRAM_DATA struct DecorPCBuffer *sDecorPCBuffer = NULL;
EWRAM_DATA struct PlaceDecorationGraphicsDataBuffer sPlaceDecorationGraphicsDataBuffer = {};
EWRAM_DATA u16 sCurDecorMapX = 0;
EWRAM_DATA u16 sCurDecorMapY = 0;
EWRAM_DATA u8 sDecor_CameraSpriteObjectIdx1 = 0;
EWRAM_DATA u8 sDecor_CameraSpriteObjectIdx2 = 0;
EWRAM_DATA u8 sDecorationLastDirectionMoved = 0;
EWRAM_DATA struct OamData sDecorSelectorOam = {};
EWRAM_DATA struct DecorRearrangementDataBuffer sDecorRearrangementDataBuffer[16] = {};
EWRAM_DATA u8 sCurDecorSelectedInRearrangement = 0;
EWRAM_DATA static u16 sCurDecorMapX = 0;
EWRAM_DATA static u16 sCurDecorMapY = 0;
EWRAM_DATA static u8 sDecor_CameraSpriteObjectIdx1 = 0;
EWRAM_DATA static u8 sDecor_CameraSpriteObjectIdx2 = 0;
EWRAM_DATA static u8 sDecorationLastDirectionMoved = 0;
EWRAM_DATA static struct OamData sDecorSelectorOam = {};
EWRAM_DATA static struct DecorRearrangementDataBuffer sDecorRearrangementDataBuffer[16] = {};
EWRAM_DATA static u8 sCurDecorSelectedInRearrangement = 0;
// Static ROM declarations
@@ -500,7 +500,7 @@ void sub_8126B80(u8 taskId)
void sub_8126C08(void)
{
FillWindowPixelBuffer(0, 0x11);
AddTextPrinterParametrized(0, 1, sSecretBasePCMenuItemDescriptions[sSecretBasePCMenuCursorPos], 0, 0, 2, 1, 3);
AddTextPrinterParameterized(0, 1, sSecretBasePCMenuItemDescriptions[sSecretBasePCMenuCursorPos], 0, 0, 2, 1, 3);
}
void SecretBasePC_Decorate(u8 taskId)
@@ -529,7 +529,7 @@ void SecretBasePC_PutAway(u8 taskId)
{
sub_8126A58(0);
sub_8197434(0, 0);
fade_screen(1, 0);
FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = sub_8129ABC;
}
@@ -727,7 +727,7 @@ void sub_81271CC(u8 taskId)
{
sub_8126A58(1);
sub_8126A88();
sub_81973C4(0, 0);
NewMenuHelpers_DrawDialogueFrame(0, 0);
sub_8126C08();
gTasks[taskId].func = sub_8126B80;
}
@@ -792,17 +792,17 @@ void sub_8127330(u8 taskId)
for (i = 0; i < sDecorPCBuffer->unk_520 - 1; i ++)
{
sub_8127454(sDecorPCBuffer->names[i], gCurDecorInventoryItems[i]);
sDecorPCBuffer->items[i].unk_00 = sDecorPCBuffer->names[i];
sDecorPCBuffer->items[i].unk_04 = i;
sDecorPCBuffer->items[i].name = sDecorPCBuffer->names[i];
sDecorPCBuffer->items[i].id = i;
}
StringCopy(sDecorPCBuffer->names[i], gText_Cancel);
sDecorPCBuffer->items[i].unk_00 = sDecorPCBuffer->names[i];
sDecorPCBuffer->items[i].unk_04 = -2;
gUnknown_03006310 = gUnknown_085A6BD0;
gUnknown_03006310.unk_10 = sDecorMenuWindowIndices[1];
gUnknown_03006310.unk_0c = sDecorPCBuffer->unk_520;
gUnknown_03006310.unk_00 = sDecorPCBuffer->items;
gUnknown_03006310.unk_0e = sDecorPCBuffer->unk_521;
sDecorPCBuffer->items[i].name = sDecorPCBuffer->names[i];
sDecorPCBuffer->items[i].id = -2;
gMultiuseListMenuTemplate = gUnknown_085A6BD0;
gMultiuseListMenuTemplate.unk_10 = sDecorMenuWindowIndices[1];
gMultiuseListMenuTemplate.totalItems = sDecorPCBuffer->unk_520;
gMultiuseListMenuTemplate.items = sDecorPCBuffer->items;
gMultiuseListMenuTemplate.maxShowed = sDecorPCBuffer->unk_521;
}
void sub_8127454(u8 *dest, u16 decorId)
@@ -871,7 +871,7 @@ void sub_812759C(u8 taskId)
sub_81272C8();
sub_81272F8();
sub_8127330(taskId);
data[13] = ListMenuInit(&gUnknown_03006310, sSecretBasePCSelectDecorPageNo, sSecretBasePCSelectDecorLineNo);
data[13] = ListMenuInit(&gMultiuseListMenuTemplate, sSecretBasePCSelectDecorPageNo, sSecretBasePCSelectDecorLineNo);
sub_8127500();
}
@@ -889,8 +889,8 @@ void sub_812764C(u8 taskId)
data = gTasks[taskId].data;
if (!gPaletteFade.active)
{
input = ListMenuHandleInput(data[13]);
get_coro_args_x18_x1A(data[13], &sSecretBasePCSelectDecorPageNo, &sSecretBasePCSelectDecorLineNo);
input = ListMenuHandleInputGetItemId(data[13]);
sub_81AE860(data[13], &sSecretBasePCSelectDecorPageNo, &sSecretBasePCSelectDecorLineNo);
switch (input)
{
case -1:
@@ -1247,7 +1247,7 @@ void sub_8127F68(u8 taskId)
{
if (sub_8127F38() == TRUE)
{
fade_screen(1, 0);
FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = sub_8128060;
}
@@ -1303,7 +1303,7 @@ void sub_8128060(u8 taskId)
void ConfigureCameraObjectForPlacingDecoration(struct PlaceDecorationGraphicsDataBuffer *data, u8 decor)
{
sDecor_CameraSpriteObjectIdx1 = gSprites[gUnknown_03005DD0.unk4].data0;
sDecor_CameraSpriteObjectIdx1 = gSprites[gUnknown_03005DD0.unk4].data[0];
gUnknown_03005DD0.unk4 = gpu_pal_decompress_alloc_tag_and_upload(data, decor);
gSprites[gUnknown_03005DD0.unk4].oam.priority = 1;
gSprites[gUnknown_03005DD0.unk4].callback = sub_81292D0;
@@ -1384,8 +1384,8 @@ void sub_812826C(u8 taskId)
void sub_81283BC(u8 taskId)
{
gTasks[taskId].data[10] = 0;
gSprites[sDecor_CameraSpriteObjectIdx1].data7 = 1;
gSprites[sDecor_CameraSpriteObjectIdx2].data7 = 1;
gSprites[sDecor_CameraSpriteObjectIdx1].data[7] = 1;
gSprites[sDecor_CameraSpriteObjectIdx2].data[7] = 1;
sub_8128DE0();
sub_8128950(taskId);
}
@@ -1393,8 +1393,8 @@ void sub_81283BC(u8 taskId)
void sub_8128414(u8 taskId)
{
gTasks[taskId].data[10] = 0;
gSprites[sDecor_CameraSpriteObjectIdx1].data7 = 1;
gSprites[sDecor_CameraSpriteObjectIdx2].data7 = 1;
gSprites[sDecor_CameraSpriteObjectIdx1].data[7] = 1;
gSprites[sDecor_CameraSpriteObjectIdx2].data[7] = 1;
sub_8128DE0();
StringExpandPlaceholders(gStringVar4, gText_CancelDecorating);
DisplayItemMessageOnField(taskId, gStringVar4, sub_8128B80);
@@ -1600,10 +1600,10 @@ void sub_81289F0(u8 taskId)
{
sCurDecorMapX = gTasks[taskId].data[0] - 7;
sCurDecorMapY = gTasks[taskId].data[1] - 7;
ScriptContext1_SetupScript(gUnknown_08275D1F);
ScriptContext1_SetupScript(EventScript_275D1F);
}
gSprites[sDecor_CameraSpriteObjectIdx1].pos1.y += 2;
if (gMapHeader.regionMapSectionId == REGION_MAP_SECRET_BASE)
if (gMapHeader.regionMapSectionId == MAPSEC_SECRET_BASE)
{
TV_PutSecretBaseVisitOnTheAir();
}
@@ -1661,7 +1661,7 @@ void sub_8128BA0(u8 taskId)
void sub_8128BBC(u8 taskId)
{
fade_screen(1, 0);
FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = c1_overworld_prev_quest;
}
@@ -1700,7 +1700,7 @@ void sub_8128C64(u8 taskId)
data[2] ++;
break;
case 1:
ScriptContext1_SetupScript(gUnknown_08275D0C);
ScriptContext1_SetupScript(EventScript_275D0C);
data[2] ++;
break;
case 2:
@@ -1770,8 +1770,8 @@ bool8 sub_8128DB4(void)
void sub_8128DE0(void)
{
sDecorationLastDirectionMoved = 0;
gSprites[sDecor_CameraSpriteObjectIdx1].data2 = 0;
gSprites[sDecor_CameraSpriteObjectIdx1].data3 = 0;
gSprites[sDecor_CameraSpriteObjectIdx1].data[2] = 0;
gSprites[sDecor_CameraSpriteObjectIdx1].data[3] = 0;
}
void sub_8128E18(u8 taskId)
@@ -1779,7 +1779,7 @@ void sub_8128E18(u8 taskId)
s16 *data;
data = gTasks[taskId].data;
if (!gSprites[sDecor_CameraSpriteObjectIdx1].data4)
if (!gSprites[sDecor_CameraSpriteObjectIdx1].data[4])
{
if (data[10] == 1)
{
@@ -1793,29 +1793,29 @@ void sub_8128E18(u8 taskId)
if ((gMain.heldKeys & 0x0F0) == DPAD_UP)
{
sDecorationLastDirectionMoved = DIR_SOUTH;
gSprites[sDecor_CameraSpriteObjectIdx1].data2 = 0;
gSprites[sDecor_CameraSpriteObjectIdx1].data3 = -2;
gSprites[sDecor_CameraSpriteObjectIdx1].data[2] = 0;
gSprites[sDecor_CameraSpriteObjectIdx1].data[3] = -2;
data[1]--;
}
if ((gMain.heldKeys & 0x0F0) == DPAD_DOWN)
{
sDecorationLastDirectionMoved = DIR_NORTH;
gSprites[sDecor_CameraSpriteObjectIdx1].data2 = 0;
gSprites[sDecor_CameraSpriteObjectIdx1].data3 = 2;
gSprites[sDecor_CameraSpriteObjectIdx1].data[2] = 0;
gSprites[sDecor_CameraSpriteObjectIdx1].data[3] = 2;
data[1]++;
}
if ((gMain.heldKeys & 0x0F0) == DPAD_LEFT)
{
sDecorationLastDirectionMoved = DIR_WEST;
gSprites[sDecor_CameraSpriteObjectIdx1].data2 = -2;
gSprites[sDecor_CameraSpriteObjectIdx1].data3 = 0;
gSprites[sDecor_CameraSpriteObjectIdx1].data[2] = -2;
gSprites[sDecor_CameraSpriteObjectIdx1].data[3] = 0;
data[0]--;
}
if ((gMain.heldKeys & 0x0F0) == DPAD_RIGHT)
{
sDecorationLastDirectionMoved = DIR_EAST;
gSprites[sDecor_CameraSpriteObjectIdx1].data2 = 2;
gSprites[sDecor_CameraSpriteObjectIdx1].data3 = 0;
gSprites[sDecor_CameraSpriteObjectIdx1].data[2] = 2;
gSprites[sDecor_CameraSpriteObjectIdx1].data[3] = 0;
data[0]++;
}
if (!sub_8128DB4() || !sub_8128D10(taskId))
@@ -1825,8 +1825,8 @@ void sub_8128E18(u8 taskId)
}
if (sDecorationLastDirectionMoved)
{
gSprites[sDecor_CameraSpriteObjectIdx1].data4++;
gSprites[sDecor_CameraSpriteObjectIdx1].data4 &= 7;
gSprites[sDecor_CameraSpriteObjectIdx1].data[4]++;
gSprites[sDecor_CameraSpriteObjectIdx1].data[4] &= 7;
}
if (!data[10])
{
@@ -1844,7 +1844,7 @@ void sub_8128E18(u8 taskId)
void sub_8128FD8(u8 taskId)
{
sub_8197434(0, 1);
gSprites[sDecor_CameraSpriteObjectIdx1].data7 = 0;
gSprites[sDecor_CameraSpriteObjectIdx1].data[7] = 0;
gTasks[taskId].data[10] = 0;
gTasks[taskId].func = sub_8128E18;
}
@@ -1955,20 +1955,20 @@ void SetDecorSelectionBoxOamAttributes(u8 decorShape)
void sub_81292D0(struct Sprite *sprite)
{
sprite->data2 = 0;
sprite->data3 = 0;
sprite->data4 = 0;
sprite->data5 = 0;
sprite->data6 = 0;
sprite->data7 = 0;
sprite->data[2] = 0;
sprite->data[3] = 0;
sprite->data[4] = 0;
sprite->data[5] = 0;
sprite->data[6] = 0;
sprite->data[7] = 0;
sprite->callback = sub_81292E8;
}
void sub_81292E8(struct Sprite *sprite)
{
if (sprite->data7 == 0)
if (sprite->data[7] == 0)
{
if (sprite->data6 < 15)
if (sprite->data[6] < 15)
{
sprite->invisible = FALSE;
}
@@ -1976,8 +1976,8 @@ void sub_81292E8(struct Sprite *sprite)
{
sprite->invisible = TRUE;
}
sprite->data6 ++;
sprite->data6 &= 0x1F;
sprite->data[6] ++;
sprite->data[6] &= 0x1F;
}
else
{
@@ -2013,9 +2013,9 @@ u8 AddDecorationIconObjectFromIconTable(u16 tilesTag, u16 paletteTag, u8 decor)
{
return MAX_SPRITES;
}
LZDecompressWram(GetDecorationIconPicOrPalette(decor, 0), gUnknown_0203CEBC);
CopyItemIconPicTo4x4Buffer(gUnknown_0203CEBC, gUnknown_0203CEC0);
sheet.data = gUnknown_0203CEC0;
LZDecompressWram(GetDecorationIconPicOrPalette(decor, 0), gItemIconDecompressionBuffer);
CopyItemIconPicTo4x4Buffer(gItemIconDecompressionBuffer, gItemIcon4x4Buffer);
sheet.data = gItemIcon4x4Buffer;
sheet.size = 0x200;
sheet.tag = tilesTag;
LoadSpriteSheet(&sheet);
@@ -2023,7 +2023,7 @@ u8 AddDecorationIconObjectFromIconTable(u16 tilesTag, u16 paletteTag, u8 decor)
palette.tag = paletteTag;
LoadCompressedObjectPalette(&palette);
template = malloc(sizeof(struct SpriteTemplate));
*template = gUnknown_08614FF4;
*template = gItemIconSpriteTemplate;
template->tileTag = tilesTag;
template->paletteTag = paletteTag;
spriteId = CreateSprite(template, 0, 0, 0);
@@ -2133,10 +2133,10 @@ void sub_8129708(void)
u16 i;
gSpecialVar_0x8005 = 0;
gScriptResult = 0;
gSpecialVar_Result = 0;
if (gSpecialVar_0x8004 == sCurDecorSelectedInRearrangement)
{
gScriptResult = 1;
gSpecialVar_Result = 1;
}
else if (gDecorations[gUnknown_0203A17C.items[sDecorRearrangementDataBuffer[gSpecialVar_0x8004].idx]].permission == DECORPERM_SOLID_MAT)
{
@@ -2206,7 +2206,7 @@ void sub_81298EC(u8 taskId)
case 1:
if (!gPaletteFade.active) {
DrawWholeMapView();
ScriptContext1_SetupScript(gUnknown_08275D2E);
ScriptContext1_SetupScript(EventScript_275D2E);
sub_8197434(0, 1);
gTasks[taskId].data[2] = 2;
}
@@ -2222,7 +2222,7 @@ void sub_81298EC(u8 taskId)
{
StringExpandPlaceholders(gStringVar4, gText_DecorationReturnedToPC);
DisplayItemMessageOnField(taskId, gStringVar4, sub_8129D64);
if (gMapHeader.regionMapSectionId == REGION_MAP_SECRET_BASE)
if (gMapHeader.regionMapSectionId == MAPSEC_SECRET_BASE)
{
TV_PutSecretBaseVisitOnTheAir();
}
@@ -2249,7 +2249,7 @@ bool8 sub_81299AC(u8 taskId)
void SetUpPuttingAwayDecorationPlayerAvatar(void)
{
player_get_direction_lower_nybble();
sDecor_CameraSpriteObjectIdx1 = gSprites[gUnknown_03005DD0.unk4].data0;
sDecor_CameraSpriteObjectIdx1 = gSprites[gUnknown_03005DD0.unk4].data[0];
sub_812A39C();
gUnknown_03005DD0.unk4 = CreateSprite(&gUnknown_085A7404, 0x78, 0x50, 0);
if (gSaveBlock2Ptr->playerGender == MALE)
@@ -2300,7 +2300,7 @@ void sub_8129ABC(u8 taskId)
void sub_8129B34(u8 taskId)
{
sub_8197434(0, 1);
gSprites[sDecor_CameraSpriteObjectIdx1].data7 = 0;
gSprites[sDecor_CameraSpriteObjectIdx1].data[7] = 0;
gSprites[sDecor_CameraSpriteObjectIdx1].invisible = FALSE;
gSprites[sDecor_CameraSpriteObjectIdx1].callback = sub_812A36C;
gSprites[sDecor_CameraSpriteObjectIdx2].pos1.x = 0x88;
@@ -2635,7 +2635,7 @@ void sub_812A1A0(u8 taskId)
void sub_812A1C0(u8 taskId)
{
fade_screen(1, 0);
FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = sub_81298EC;
}
@@ -2654,7 +2654,7 @@ void sub_812A210(u8 taskId)
void sub_812A22C(u8 taskId)
{
fade_screen(1, 0);
FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = sub_812A25C;
}
@@ -2691,7 +2691,7 @@ void sub_812A2C4(u8 taskId)
data[2] ++;
break;
case 1:
ScriptContext1_SetupScript(gUnknown_08275D0C);
ScriptContext1_SetupScript(EventScript_275D0C);
data[2] ++;
break;
case 2:
@@ -2712,7 +2712,7 @@ void sub_812A334(void)
u8 taskId;
pal_fill_black();
sub_81973C4(0, 1);
NewMenuHelpers_DrawDialogueFrame(0, 1);
sub_8126ABC();
taskId = CreateTask(sub_812A2C4, 8);
gTasks[taskId].data[2] = 0;
@@ -2720,9 +2720,9 @@ void sub_812A334(void)
void sub_812A36C(struct Sprite *sprite)
{
sprite->data0 ++;
sprite->data0 &= 0x1F;
if (sprite->data0 > 15)
sprite->data[0] ++;
sprite->data[0] &= 0x1F;
if (sprite->data[0] > 15)
{
sprite->invisible = TRUE;
}
+1
View File
@@ -1,6 +1,7 @@
// Includes
#include "global.h"
#include "constants/decorations.h"
#include "decoration.h"
#include "decoration_inventory.h"
Executable → Regular
+5 -10
View File
@@ -3,7 +3,7 @@
#include "palette.h"
#include "main.h"
#include "gpu_regs.h"
#include "unknown_task.h"
#include "scanline_effect.h"
#include "task.h"
#include "malloc.h"
#include "decompress.h"
@@ -17,7 +17,7 @@ extern int decompress_and_copy_tile_data_to_vram(u8 bg_id, void *src, int size,
extern bool8 free_temp_tile_data_buffers_if_possible(void);
extern void sub_80861E8(void); // rom4
extern bool16 sub_80C0944(void);
extern void AddTextPrinterParametrized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, struct TextColor *color, s8 speed, u8 *str);
extern void AddTextPrinterParameterized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 *color, s8 speed, u8 *str);
extern u16 gUnknown_0860F074[];
@@ -72,7 +72,7 @@ void CB2_ShowDiploma(void)
DmaFill16(3, 0, VRAM, VRAM_SIZE);
DmaFill32(3, 0, OAM, OAM_SIZE);
DmaFill16(3, 0, PLTT, PLTT_SIZE);
remove_some_task();
ScanlineEffect_Stop();
ResetTasks();
ResetSpriteData();
ResetPaletteFade();
@@ -208,12 +208,7 @@ static void InitDiplomaWindow(void)
static void PrintDiplomaText(u8 *text, u8 var1, u8 var2)
{
struct TextColor color =
{
.fgColor = 0,
.bgColor = 2,
.shadowColor = 3,
};
u8 color[3] = {0, 2, 3};
AddTextPrinterParametrized2(0, 1, var1, var2, 0, 0, &color, -1, text);
AddTextPrinterParameterized2(0, 1, var1, var2, 0, 0, color, -1, text);
}
+129 -426
View File
@@ -1,13 +1,24 @@
#include "global.h"
#include "dma3.h"
IWRAM_DATA struct {
/* 0x00 */ const u8 *src;
/* 0x04 */ u8 *dest;
/* 0x08 */ u16 size;
/* 0x0A */ u16 mode;
/* 0x0C */ u32 value;
} gDma3Requests[128];
// Maximum amount of data we will transfer in one operation
#define MAX_DMA_BLOCK_SIZE 0x1000
#define MAX_DMA_REQUESTS 128
#define DMA_REQUEST_COPY32 1
#define DMA_REQUEST_FILL32 2
#define DMA_REQUEST_COPY16 3
#define DMA_REQUEST_FILL16 4
IWRAM_DATA struct
{
const u8 *src;
u8 *dest;
u16 size;
u16 mode;
u32 value;
} gDma3Requests[MAX_DMA_REQUESTS];
static bool8 gDma3ManagerLocked;
static u8 gDma3RequestCursor;
@@ -19,88 +30,103 @@ void ClearDma3Requests(void)
gDma3ManagerLocked = TRUE;
gDma3RequestCursor = 0;
for(i = 0; i < (u8)ARRAY_COUNT(gDma3Requests); i++)
for (i = 0; i < MAX_DMA_REQUESTS; i++)
{
gDma3Requests[i].size = 0;
gDma3Requests[i].src = 0;
gDma3Requests[i].dest = 0;
gDma3Requests[i].src = NULL;
gDma3Requests[i].dest = NULL;
}
gDma3ManagerLocked = FALSE;
}
#ifdef NONMATCHING
#define Dma3CopyLarge_(src, dest, size, bit) \
{ \
const void *_src = src; \
void *_dest = dest; \
u32 _size = size; \
while (1) \
{ \
if (_size <= MAX_DMA_BLOCK_SIZE) \
{ \
DmaCopy##bit(3, _src, _dest, _size); \
break; \
} \
DmaCopy##bit(3, _src, _dest, MAX_DMA_BLOCK_SIZE); \
_src += MAX_DMA_BLOCK_SIZE; \
_dest += MAX_DMA_BLOCK_SIZE; \
_size -= MAX_DMA_BLOCK_SIZE; \
} \
}
#define Dma3CopyLarge16_(src, dest, size) Dma3CopyLarge_(src, dest, size, 16)
#define Dma3CopyLarge32_(src, dest, size) Dma3CopyLarge_(src, dest, size, 32)
#define Dma3FillLarge_(value, dest, size, bit) \
{ \
void *_dest = dest; \
u32 _size = size; \
while (1) \
{ \
if (_size <= MAX_DMA_BLOCK_SIZE) \
{ \
DmaFill##bit(3, value, _dest, _size); \
break; \
} \
DmaFill##bit(3, value, _dest, MAX_DMA_BLOCK_SIZE); \
_dest += MAX_DMA_BLOCK_SIZE; \
_size -= MAX_DMA_BLOCK_SIZE; \
} \
}
#define Dma3FillLarge16_(value, dest, size) Dma3FillLarge_(value, dest, size, 16)
#define Dma3FillLarge32_(value, dest, size) Dma3FillLarge_(value, dest, size, 32)
void ProcessDma3Requests(void)
{
// NOTE: the fillerA member of the DMA struct is actually u32 value;
u16 total_size;
u16 bytesTransferred;
if (gDma3ManagerLocked)
return;
total_size = 0;
bytesTransferred = 0;
// as long as there are DMA requests to process (unless size or vblank is an issue), do not exit
while (gDma3Requests[gDma3RequestCursor].size)
while (gDma3Requests[gDma3RequestCursor].size != 0)
{
total_size += gDma3Requests[gDma3RequestCursor].size;
bytesTransferred += gDma3Requests[gDma3RequestCursor].size;
if (total_size > 0xA000)
return; // don't do too much at once
if (REG_VCOUNT > 224)
return;// we're about to leave vblank, stop
if (bytesTransferred > 40 * 1024)
return; // don't transfer more than 40 KiB
if (*(u8 *)REG_ADDR_VCOUNT > 224)
return; // we're about to leave vblank, stop
switch (gDma3Requests[gDma3RequestCursor].mode)
{
case 1: // regular 32-bit copy
// _08000C8C
if(gDma3Requests[gDma3RequestCursor].size <= 0x1000)
{
DmaCopy32(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size);
break;
}
while (gDma3Requests[gDma3RequestCursor].size > 0x1000)
{
DmaCopy32(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, 0x1000);
gDma3Requests[gDma3RequestCursor].src += 0x1000;
gDma3Requests[gDma3RequestCursor].dest += 0x1000;
gDma3Requests[gDma3RequestCursor].size -= 0x1000;
}
DmaCopy32(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size);
case DMA_REQUEST_COPY32: // regular 32-bit copy
Dma3CopyLarge32_(gDma3Requests[gDma3RequestCursor].src,
gDma3Requests[gDma3RequestCursor].dest,
gDma3Requests[gDma3RequestCursor].size);
break;
case 2: // repeat a single 32-bit value across RAM
// _08000CD0
while (gDma3Requests[gDma3RequestCursor].size > 0x1000)
{
DmaFill32(3, gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, 0x1000);
gDma3Requests[gDma3RequestCursor].dest += 0x1000;
gDma3Requests[gDma3RequestCursor].size -= 0x1000;
}
DmaFill32(3, gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size);
case DMA_REQUEST_FILL32: // repeat a single 32-bit value across RAM
Dma3FillLarge32_(gDma3Requests[gDma3RequestCursor].value,
gDma3Requests[gDma3RequestCursor].dest,
gDma3Requests[gDma3RequestCursor].size);
break;
case 3: // regular 16-bit copy
// _08000D3C
while (gDma3Requests[gDma3RequestCursor].size > 0x1000)
{
DmaCopy16(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, 0x1000);
gDma3Requests[gDma3RequestCursor].src += 0x1000;
gDma3Requests[gDma3RequestCursor].dest += 0x1000;
gDma3Requests[gDma3RequestCursor].size -= 0x1000;
}
DmaCopy16(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size);
case DMA_REQUEST_COPY16: // regular 16-bit copy
Dma3CopyLarge16_(gDma3Requests[gDma3RequestCursor].src,
gDma3Requests[gDma3RequestCursor].dest,
gDma3Requests[gDma3RequestCursor].size);
break;
case 4: // repeat a single 16-bit value across RAM
// _08000D88
while (gDma3Requests[gDma3RequestCursor].size > 0x1000)
{
DmaFill16(3, gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, 0x1000);
gDma3Requests[gDma3RequestCursor].dest += 0x1000;
gDma3Requests[gDma3RequestCursor].size -= 0x1000;
}
DmaFill16(3, gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size);
case DMA_REQUEST_FILL16: // repeat a single 16-bit value across RAM
Dma3FillLarge16_(gDma3Requests[gDma3RequestCursor].value,
gDma3Requests[gDma3RequestCursor].dest,
gDma3Requests[gDma3RequestCursor].size);
break;
}
// Free the request
gDma3Requests[gDma3RequestCursor].src = NULL;
gDma3Requests[gDma3RequestCursor].dest = NULL;
gDma3Requests[gDma3RequestCursor].size = 0;
@@ -108,375 +134,54 @@ void ProcessDma3Requests(void)
gDma3Requests[gDma3RequestCursor].value = 0;
gDma3RequestCursor++;
if (gDma3RequestCursor >= 128) // loop back to the first DMA request
if (gDma3RequestCursor >= MAX_DMA_REQUESTS) // loop back to the first DMA request
gDma3RequestCursor = 0;
}
}
#else
__attribute__((naked))
void ProcessDma3Requests(void)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
mov r7, r10\n\
mov r6, r9\n\
mov r5, r8\n\
push {r5-r7}\n\
sub sp, 0xC\n\
ldr r0, =gDma3ManagerLocked\n\
ldrb r0, [r0]\n\
cmp r0, 0\n\
beq _08000C06\n\
b _08000E46\n\
_08000C06:\n\
movs r0, 0\n\
str r0, [sp, 0x8]\n\
ldr r1, =gDma3Requests\n\
ldr r2, =gDma3RequestCursor\n\
ldrb r0, [r2]\n\
lsls r0, 4\n\
adds r0, r1\n\
ldrh r0, [r0, 0x8]\n\
mov r12, r2\n\
cmp r0, 0\n\
bne _08000C1E\n\
b _08000E46\n\
_08000C1E:\n\
mov r8, r1\n\
adds r1, 0x4\n\
mov r10, r1\n\
movs r6, 0x80\n\
lsls r6, 5\n\
ldr r7, =0x040000D4 @REG_DMA3\n\
movs r2, 0\n\
mov r9, r2\n\
_08000C2E:\n\
mov r3, r12 @ gDma3RequestCursor\n\
ldrb r0, [r3]\n\
lsls r5, r0, 4\n\
mov r0, r8 @ gDma3Requests\n\
adds r1, r5, r0 @ gDma3Requests[gDma3RequestCursor]\n\
ldrh r0, [r1, 0x8] @ gDma3Requests[gDma3RequestCursor].size\n\
ldr r2, [sp, 0x8]\n\
adds r0, r2, r0\n\
lsls r0, 16\n\
lsrs r0, 16\n\
str r0, [sp, 0x8]\n\
movs r0, 0xA0\n\
lsls r0, 8\n\
ldr r3, [sp, 0x8]\n\
cmp r3, r0\n\
bls _08000C50\n\
b _08000E46\n\
_08000C50:\n\
ldr r0, =0x04000006 @REG_VCOUNT\n\
ldrb r0, [r0]\n\
cmp r0, 0xE0\n\
bls _08000C5A\n\
b _08000E46\n\
_08000C5A:\n\
ldrh r0, [r1, 0xA]\n\
cmp r0, 0x2\n\
beq _08000CD0\n\
cmp r0, 0x2\n\
bgt _08000C80\n\
cmp r0, 0x1\n\
beq _08000C8C\n\
b _08000DF0\n\
.pool\n\
_08000C80:\n\
cmp r0, 0x3\n\
beq _08000D3C\n\
cmp r0, 0x4\n\
bne _08000C8A\n\
b _08000D88\n\
_08000C8A:\n\
b _08000DF0\n\
_08000C8C:\n\
ldr r3, [r1]\n\
mov r2, r10\n\
adds r0, r5, r2\n\
ldr r2, [r0]\n\
ldrh r1, [r1, 0x8]\n\
cmp r1, r6\n\
bhi _08000CA6\n\
str r3, [r7]\n\
str r2, [r7, 0x4]\n\
lsrs r0, r1, 2\n\
movs r1, 0x84\n\
lsls r1, 24\n\
b _08000DAA\n\
_08000CA6:\n\
ldr r4, =0x040000D4 @REG_DMA3\n\
str r3, [r4]\n\
str r2, [r4, 0x4]\n\
ldr r0, =0x84000400\n\
str r0, [r4, 0x8]\n\
ldr r0, [r4, 0x8]\n\
adds r3, r6\n\
adds r2, r6\n\
subs r1, r6\n\
cmp r1, r6\n\
bhi _08000CA6\n\
str r3, [r4]\n\
str r2, [r4, 0x4]\n\
lsrs r0, r1, 2\n\
movs r1, 0x84\n\
lsls r1, 24\n\
b _08000D76\n\
.pool\n\
_08000CD0:\n\
mov r3, r10\n\
adds r0, r5, r3\n\
ldr r4, [r0]\n\
ldrh r1, [r1, 0x8]\n\
cmp r1, r6\n\
bhi _08000CF4\n\
mov r0, r8\n\
adds r0, 0xC\n\
adds r0, r5, r0\n\
ldr r0, [r0]\n\
str r0, [sp]\n\
mov r5, sp\n\
str r5, [r7]\n\
str r4, [r7, 0x4]\n\
lsrs r0, r1, 2\n\
movs r1, 0x85\n\
lsls r1, 24\n\
b _08000DAA\n\
_08000CF4:\n\
mov r2, r12\n\
ldrb r0, [r2]\n\
lsls r0, 4\n\
mov r5, r8\n\
adds r5, 0xC\n\
adds r0, r5\n\
ldr r0, [r0]\n\
str r0, [sp]\n\
ldr r3, =0x040000D4 @REG_DMA3\n\
mov r0, sp\n\
str r0, [r3]\n\
str r4, [r3, 0x4]\n\
ldr r0, =0x85000400\n\
str r0, [r3, 0x8]\n\
ldr r0, [r3, 0x8]\n\
adds r4, r6\n\
subs r1, r6\n\
cmp r1, r6\n\
bhi _08000CF4\n\
ldrb r0, [r2]\n\
lsls r0, 4\n\
adds r0, r5\n\
ldr r0, [r0]\n\
str r0, [sp]\n\
mov r2, sp\n\
str r2, [r3]\n\
str r4, [r3, 0x4]\n\
lsrs r0, r1, 2\n\
movs r1, 0x85\n\
lsls r1, 24\n\
b _08000DEA\n\
.pool\n\
_08000D3C:\n\
ldr r3, [r1]\n\
mov r2, r10\n\
adds r0, r5, r2\n\
ldr r2, [r0]\n\
ldrh r1, [r1, 0x8]\n\
cmp r1, r6\n\
bhi _08000D56\n\
str r3, [r7]\n\
str r2, [r7, 0x4]\n\
lsrs r0, r1, 1\n\
movs r1, 0x80\n\
lsls r1, 24\n\
b _08000DAA\n\
_08000D56:\n\
ldr r4, =0x040000D4 @REG_DMA3\n\
str r3, [r4]\n\
str r2, [r4, 0x4]\n\
ldr r0, =0x80000800\n\
str r0, [r4, 0x8]\n\
ldr r0, [r4, 0x8]\n\
adds r3, r6\n\
adds r2, r6\n\
subs r1, r6\n\
cmp r1, r6\n\
bhi _08000D56\n\
str r3, [r4]\n\
str r2, [r4, 0x4]\n\
lsrs r0, r1, 1\n\
movs r1, 0x80\n\
lsls r1, 24\n\
_08000D76:\n\
orrs r0, r1\n\
str r0, [r4, 0x8]\n\
ldr r0, [r4, 0x8]\n\
b _08000DF0\n\
.pool\n\
_08000D88:\n\
mov r3, r10\n\
adds r0, r5, r3\n\
ldr r2, [r0]\n\
ldrh r4, [r1, 0x8]\n\
add r1, sp, 0x4\n\
cmp r4, r6\n\
bhi _08000DB2\n\
mov r0, r8\n\
adds r0, 0xC\n\
adds r0, r5, r0\n\
ldr r0, [r0]\n\
strh r0, [r1]\n\
str r1, [r7]\n\
str r2, [r7, 0x4]\n\
lsrs r0, r4, 1\n\
movs r1, 0x81\n\
lsls r1, 24\n\
_08000DAA:\n\
orrs r0, r1\n\
str r0, [r7, 0x8]\n\
ldr r0, [r7, 0x8]\n\
b _08000DF0\n\
_08000DB2:\n\
mov r5, r12\n\
ldrb r0, [r5]\n\
lsls r0, 4\n\
ldr r3, =gDma3Requests + 0x0C\n\
adds r0, r3\n\
ldr r0, [r0]\n\
strh r0, [r1]\n\
ldr r3, =0x040000D4 @REG_DMA3\n\
str r1, [r3]\n\
str r2, [r3, 0x4]\n\
ldr r0, =0x81000800\n\
str r0, [r3, 0x8]\n\
ldr r0, [r3, 0x8]\n\
adds r2, r6\n\
subs r4, r6\n\
cmp r4, r6\n\
bhi _08000DB2\n\
ldrb r0, [r5]\n\
lsls r0, 4\n\
ldr r5, =gDma3Requests + 0x0C\n\
adds r0, r5\n\
ldr r0, [r0]\n\
strh r0, [r1]\n\
str r1, [r3]\n\
str r2, [r3, 0x4]\n\
lsrs r0, r4, 1\n\
movs r1, 0x81\n\
lsls r1, 24\n\
_08000DEA:\n\
orrs r0, r1\n\
str r0, [r3, 0x8]\n\
ldr r0, [r3, 0x8]\n\
_08000DF0:\n\
ldr r1, =gDma3Requests\n\
mov r3, r12\n\
ldrb r0, [r3]\n\
lsls r0, 4\n\
adds r0, r1\n\
mov r2, r9\n\
str r2, [r0]\n\
ldrb r0, [r3]\n\
lsls r0, 4\n\
add r0, r10\n\
str r2, [r0]\n\
ldrb r0, [r3]\n\
lsls r0, 4\n\
adds r0, r1\n\
movs r4, 0\n\
strh r2, [r0, 0x8]\n\
ldrb r0, [r3]\n\
lsls r0, 4\n\
adds r0, r1\n\
mov r5, r9\n\
strh r5, [r0, 0xA]\n\
ldrb r0, [r3]\n\
lsls r0, 4\n\
adds r1, 0xC\n\
adds r0, r1\n\
mov r1, r9\n\
str r1, [r0]\n\
ldrb r0, [r3]\n\
adds r0, 0x1\n\
strb r0, [r3]\n\
lsls r0, 24\n\
cmp r0, 0\n\
bge _08000E34\n\
strb r4, [r3]\n\
_08000E34:\n\
mov r2, r12\n\
ldrb r0, [r2]\n\
lsls r0, 4\n\
ldr r3, =gDma3Requests\n\
adds r0, r3\n\
ldrh r0, [r0, 0x8]\n\
cmp r0, 0\n\
beq _08000E46\n\
b _08000C2E\n\
_08000E46:\n\
add sp, 0xC\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
int RequestDma3Copy(const void *src, void *dest, u16 size, u8 mode)
s16 RequestDma3Copy(const void *src, void *dest, u16 size, u8 mode)
{
int cursor;
int var = 0;
gDma3ManagerLocked = 1;
int i = 0;
gDma3ManagerLocked = TRUE;
cursor = gDma3RequestCursor;
while(1)
while (i < MAX_DMA_REQUESTS)
{
if(!gDma3Requests[cursor].size) // an empty copy was found and the current cursor will be returned.
if (gDma3Requests[cursor].size == 0) // an empty request was found.
{
gDma3Requests[cursor].src = src;
gDma3Requests[cursor].dest = dest;
gDma3Requests[cursor].size = size;
if(mode == 1)
gDma3Requests[cursor].mode = mode;
if (mode == 1)
gDma3Requests[cursor].mode = DMA_REQUEST_COPY32;
else
gDma3Requests[cursor].mode = 3;
gDma3Requests[cursor].mode = DMA_REQUEST_COPY16;
gDma3ManagerLocked = FALSE;
return (s16)cursor;
return cursor;
}
if(++cursor >= 0x80) // loop back to start.
{
if (++cursor >= MAX_DMA_REQUESTS) // loop back to start.
cursor = 0;
}
if(++var >= 0x80) // max checks were made. all resulted in failure.
{
break;
}
i++;
}
gDma3ManagerLocked = FALSE;
return -1;
return -1; // no free DMA request was found
}
int RequestDma3Fill(s32 value, void *dest, u16 size, u8 mode)
s16 RequestDma3Fill(s32 value, void *dest, u16 size, u8 mode)
{
int cursor;
int var = 0;
int i = 0;
cursor = gDma3RequestCursor;
gDma3ManagerLocked = 1;
gDma3ManagerLocked = TRUE;
while(1)
while (i < MAX_DMA_REQUESTS)
{
if(!gDma3Requests[cursor].size)
if (gDma3Requests[cursor].size == 0) // an empty request was found.
{
gDma3Requests[cursor].dest = dest;
gDma3Requests[cursor].size = size;
@@ -484,41 +189,39 @@ int RequestDma3Fill(s32 value, void *dest, u16 size, u8 mode)
gDma3Requests[cursor].value = value;
if(mode == 1)
gDma3Requests[cursor].mode = 2;
gDma3Requests[cursor].mode = DMA_REQUEST_FILL32;
else
gDma3Requests[cursor].mode = 4;
gDma3Requests[cursor].mode = DMA_REQUEST_FILL16;
gDma3ManagerLocked = FALSE;
return (s16)cursor;
return cursor;
}
if(++cursor >= 0x80) // loop back to start.
{
if (++cursor >= MAX_DMA_REQUESTS) // loop back to start.
cursor = 0;
}
if(++var >= 0x80) // max checks were made. all resulted in failure.
{
break;
}
i++;
}
gDma3ManagerLocked = FALSE;
return -1;
return -1; // no free DMA request was found
}
int CheckForSpaceForDma3Request(s16 index)
s16 CheckForSpaceForDma3Request(s16 index)
{
int current = 0;
int i = 0;
if (index == -1)
if (index == -1) // check if all requests are free
{
for (; current < 0x80; current ++)
if (gDma3Requests[current].size)
while (i < MAX_DMA_REQUESTS)
{
if (gDma3Requests[i].size != 0)
return -1;
i++;
}
return 0;
}
else // check the specified request
{
if (gDma3Requests[index].size != 0)
return -1;
return 0;
}
if (gDma3Requests[index].size)
return -1;
return 0;
}
+77 -78
View File
@@ -1,7 +1,8 @@
#include "global.h"
#include "pokemon.h"
#include "egg_hatch.h"
#include "pokedex.h"
#include "items.h"
#include "constants/items.h"
#include "script.h"
#include "decompress.h"
#include "task.h"
@@ -9,20 +10,21 @@
#include "main.h"
#include "event_data.h"
#include "sound.h"
#include "songs.h"
#include "constants/songs.h"
#include "text.h"
#include "text_window.h"
#include "string_util.h"
#include "menu.h"
#include "trig.h"
#include "rng.h"
#include "random.h"
#include "malloc.h"
#include "dma3.h"
#include "gpu_regs.h"
#include "bg.h"
#include "m4a.h"
#include "window.h"
#include "abilities.h"
#include "constants/abilities.h"
#include "daycare.h"
#include "battle.h" // to get rid of later
struct EggHatchData
@@ -39,43 +41,40 @@ struct EggHatchData
u8 unused_9;
u8 unused_A;
u16 species;
struct TextColor textColor;
u8 textColor[3];
};
extern struct SpriteTemplate gUnknown_0202499C;
extern void (*gFieldCallback)(void);
extern const struct CompressedSpriteSheet gMonFrontPicTable[];
extern const u8 gUnknown_08C00000[];
extern const u8 gUnknown_08C00524[];
extern const u8 gUnknown_08C004E0[];
extern const u16 gUnknown_08DD7300[]; // palette, gameboy advance
extern const u32 gUnknown_08DD7360[]; // tileset gameboy advance
extern const u8 gBattleTextboxTiles[];
extern const u8 gBattleTextboxTilemap[];
extern const u8 gBattleTextboxPalette[];
extern const u16 gTradeGba2_Pal[]; // palette, gameboy advance
extern const u32 gTradeGba_Gfx[]; // tileset gameboy advance
extern const u32 gUnknown_08331F60[]; // tilemap gameboy circle
extern const u8 gText_HatchedFromEgg[];
extern const u8 gText_NickHatchPrompt[];
extern u8* GetMonNick(struct Pokemon* mon, u8* dst);
extern u8* GetBoxMonNick(struct BoxPokemon* boxMon, u8* dst);
extern u8 sav1_map_get_name(void);
extern s8 sub_8198C58(void);
extern s8 ProcessMenuInputNoWrap_(void);
extern void TVShowConvertInternationalString(u8* str1, u8* str2, u8);
extern void sub_806A068(u16, u8);
extern void fade_screen(u8, u8);
extern void FadeScreen(u8, u8);
extern void overworld_free_bg_tilemaps(void);
extern void sub_80AF168(void);
extern void AllocateMonSpritesGfx(void);
extern void FreeMonSpritesGfx(void);
extern void remove_some_task(void);
extern void ScanlineEffect_Stop(void);
extern void reset_temp_tile_data_buffers(void);
extern void c2_exit_to_overworld_2_switch(void);
extern void play_some_sound(void);
extern void copy_decompressed_tile_data_to_vram_autofree(u8 bg_id, const void* src, u16 size, u16 offset, u8 mode);
extern void CreateYesNoMenu(const struct WindowTemplate*, u16, u8, u8);
extern void DoNamingScreen(u8, const u8*, u16, u8, u32, MainCallback);
extern void AddTextPrinterParametrized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, struct TextColor* colors, s8 speed, u8 *str);
extern u16 sub_80D22D0(void);
extern u8 sub_80C7050(u8);
extern u8 CountPartyAliveNonEggMonsExcept(u8);
static void Task_EggHatch(u8 taskID);
static void CB2_EggHatch_0(void);
@@ -92,7 +91,7 @@ static void CreateRandomEggShardSprite(void);
static void CreateEggShardSprite(u8 x, u8 y, s16 data1, s16 data2, s16 data3, u8 spriteAnimIndex);
// IWRAM bss
static IWRAM_DATA struct EggHatchData* sEggHatchData;
static IWRAM_DATA struct EggHatchData *sEggHatchData;
// rom data
static const u16 sEggPalette[] = INCBIN_U16("graphics/pokemon/palettes/egg_palette.gbapal");
@@ -327,7 +326,7 @@ static void CreatedHatchedMon(struct Pokemon *egg, struct Pokemon *temp)
pokerus = GetMonData(egg, MON_DATA_POKERUS);
obedience = GetMonData(egg, MON_DATA_OBEDIENCE);
CreateMon(temp, species, 5, 32, TRUE, personality, 0, 0);
CreateMon(temp, species, EGG_HATCH_LEVEL, 32, TRUE, personality, 0, 0);
for (i = 0; i < 4; i++)
{
@@ -393,19 +392,19 @@ void ScriptHatchMon(void)
AddHatchedMonToParty(gSpecialVar_0x8004);
}
static bool8 sub_807158C(struct DaycareData* daycare, u8 daycareId)
static bool8 sub_807158C(struct DayCare *daycare, u8 daycareId)
{
u8 nick[0x20];
struct DaycareMon* daycareMon = &daycare->mons[daycareId];
struct DaycareMon *daycareMon = &daycare->mons[daycareId];
GetBoxMonNick(&daycareMon->mon, nick);
if (daycareMon->mail.itemId != 0
&& (StringCompareWithoutExtCtrlCodes(nick, daycareMon->monName) != 0
|| StringCompareWithoutExtCtrlCodes(gSaveBlock2Ptr->playerName, daycareMon->OT_name) != 0))
if (daycareMon->misc.mail.itemId != 0
&& (StringCompareWithoutExtCtrlCodes(nick, daycareMon->misc.monName) != 0
|| StringCompareWithoutExtCtrlCodes(gSaveBlock2Ptr->playerName, daycareMon->misc.OT_name) != 0))
{
StringCopy(gStringVar1, nick);
TVShowConvertInternationalString(gStringVar2, daycareMon->OT_name, daycareMon->language_maybe);
TVShowConvertInternationalString(gStringVar3, daycareMon->monName, daycareMon->unknown);
TVShowConvertInternationalString(gStringVar2, daycareMon->misc.OT_name, daycareMon->misc.gameLanguage);
TVShowConvertInternationalString(gStringVar3, daycareMon->misc.monName, daycareMon->misc.monLanguage);
return TRUE;
}
return FALSE;
@@ -466,7 +465,7 @@ void EggHatch(void)
{
ScriptContext2_Enable();
CreateTask(Task_EggHatch, 10);
fade_screen(1, 0);
FadeScreen(1, 0);
}
static void Task_EggHatch(u8 taskID)
@@ -513,7 +512,7 @@ static void CB2_EggHatch_0(void)
FreeAllSpritePalettes();
ResetSpriteData();
ResetTasks();
remove_some_task();
ScanlineEffect_Stop();
m4aSoundVSyncOn();
gMain.state++;
break;
@@ -523,9 +522,9 @@ static void CB2_EggHatch_0(void)
gMain.state++;
break;
case 2:
copy_decompressed_tile_data_to_vram_autofree(0, gUnknown_08C00000, 0, 0, 0);
CopyToBgTilemapBuffer(0, gUnknown_08C00524, 0, 0);
LoadCompressedPalette(gUnknown_08C004E0, 0, 0x20);
copy_decompressed_tile_data_to_vram_autofree(0, gBattleTextboxTiles, 0, 0, 0);
CopyToBgTilemapBuffer(0, gBattleTextboxTilemap, 0, 0);
LoadCompressedPalette(gBattleTextboxPalette, 0, 0x20);
gMain.state++;
break;
case 3:
@@ -549,8 +548,8 @@ static void CB2_EggHatch_0(void)
break;
case 7:
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
LoadPalette(gUnknown_08DD7300, 0x10, 0xA0);
LoadBgTiles(1, gUnknown_08DD7360, 0x1420, 0);
LoadPalette(gTradeGba2_Pal, 0x10, 0xA0);
LoadBgTiles(1, gTradeGba_Gfx, 0x1420, 0);
CopyToBgTilemapBuffer(1, gUnknown_08331F60, 0x1000, 0);
CopyBgTilemapBufferToVram(1);
gMain.state++;
@@ -670,7 +669,7 @@ static void CB2_EggHatch_1(void)
}
break;
case 10:
switch (sub_8198C58())
switch (ProcessMenuInputNoWrap_())
{
case 0:
GetMonNick(&gPlayerParty[sEggHatchData->eggPartyID], gStringVar3);
@@ -710,16 +709,16 @@ static void CB2_EggHatch_1(void)
static void SpriteCB_Egg_0(struct Sprite* sprite)
{
if (++sprite->data0 > 20)
if (++sprite->data[0] > 20)
{
sprite->callback = SpriteCB_Egg_1;
sprite->data0 = 0;
sprite->data[0] = 0;
}
else
{
sprite->data1 = (sprite->data1 + 20) & 0xFF;
sprite->pos2.x = Sin(sprite->data1, 1);
if (sprite->data0 == 15)
sprite->data[1] = (sprite->data[1] + 20) & 0xFF;
sprite->pos2.x = Sin(sprite->data[1], 1);
if (sprite->data[0] == 15)
{
PlaySE(SE_BOWA);
StartSpriteAnim(sprite, 1);
@@ -730,19 +729,19 @@ static void SpriteCB_Egg_0(struct Sprite* sprite)
static void SpriteCB_Egg_1(struct Sprite* sprite)
{
if (++sprite->data2 > 30)
if (++sprite->data[2] > 30)
{
if (++sprite->data0 > 20)
if (++sprite->data[0] > 20)
{
sprite->callback = SpriteCB_Egg_2;
sprite->data0 = 0;
sprite->data2 = 0;
sprite->data[0] = 0;
sprite->data[2] = 0;
}
else
{
sprite->data1 = (sprite->data1 + 20) & 0xFF;
sprite->pos2.x = Sin(sprite->data1, 2);
if (sprite->data0 == 15)
sprite->data[1] = (sprite->data[1] + 20) & 0xFF;
sprite->pos2.x = Sin(sprite->data[1], 2);
if (sprite->data[0] == 15)
{
PlaySE(SE_BOWA);
StartSpriteAnim(sprite, 2);
@@ -753,30 +752,30 @@ static void SpriteCB_Egg_1(struct Sprite* sprite)
static void SpriteCB_Egg_2(struct Sprite* sprite)
{
if (++sprite->data2 > 30)
if (++sprite->data[2] > 30)
{
if (++sprite->data0 > 38)
if (++sprite->data[0] > 38)
{
u16 species;
sprite->callback = SpriteCB_Egg_3;
sprite->data0 = 0;
sprite->data[0] = 0;
species = GetMonData(&gPlayerParty[sEggHatchData->eggPartyID], MON_DATA_SPECIES);
gSprites[sEggHatchData->pokeSpriteID].pos2.x = 0;
gSprites[sEggHatchData->pokeSpriteID].pos2.y = 0;
}
else
{
sprite->data1 = (sprite->data1 + 20) & 0xFF;
sprite->pos2.x = Sin(sprite->data1, 2);
if (sprite->data0 == 15)
sprite->data[1] = (sprite->data[1] + 20) & 0xFF;
sprite->pos2.x = Sin(sprite->data[1], 2);
if (sprite->data[0] == 15)
{
PlaySE(SE_BOWA);
StartSpriteAnim(sprite, 2);
CreateRandomEggShardSprite();
CreateRandomEggShardSprite();
}
if (sprite->data0 == 30)
if (sprite->data[0] == 30)
PlaySE(SE_BOWA);
}
}
@@ -784,60 +783,60 @@ static void SpriteCB_Egg_2(struct Sprite* sprite)
static void SpriteCB_Egg_3(struct Sprite* sprite)
{
if (++sprite->data0 > 50)
if (++sprite->data[0] > 50)
{
sprite->callback = SpriteCB_Egg_4;
sprite->data0 = 0;
sprite->data[0] = 0;
}
}
static void SpriteCB_Egg_4(struct Sprite* sprite)
{
s16 i;
if (sprite->data0 == 0)
if (sprite->data[0] == 0)
BeginNormalPaletteFade(-1, -1, 0, 0x10, 0xFFFF);
if (sprite->data0 < 4u)
if (sprite->data[0] < 4u)
{
for (i = 0; i <= 3; i++)
CreateRandomEggShardSprite();
}
sprite->data0++;
sprite->data[0]++;
if (!gPaletteFade.active)
{
PlaySE(SE_TAMAGO);
sprite->invisible = 1;
sprite->callback = SpriteCB_Egg_5;
sprite->data0 = 0;
sprite->data[0] = 0;
}
}
static void SpriteCB_Egg_5(struct Sprite* sprite)
{
if (sprite->data0 == 0)
if (sprite->data[0] == 0)
{
gSprites[sEggHatchData->pokeSpriteID].invisible = 0;
StartSpriteAffineAnim(&gSprites[sEggHatchData->pokeSpriteID], 1);
}
if (sprite->data0 == 8)
if (sprite->data[0] == 8)
BeginNormalPaletteFade(-1, -1, 0x10, 0, 0xFFFF);
if (sprite->data0 <= 9)
if (sprite->data[0] <= 9)
gSprites[sEggHatchData->pokeSpriteID].pos1.y -= 1;
if (sprite->data0 > 40)
if (sprite->data[0] > 40)
sprite->callback = SpriteCallbackDummy;
sprite->data0++;
sprite->data[0]++;
}
static void SpriteCB_EggShard(struct Sprite* sprite)
{
sprite->data4 += sprite->data1;
sprite->data5 += sprite->data2;
sprite->data[4] += sprite->data[1];
sprite->data[5] += sprite->data[2];
sprite->pos2.x = sprite->data4 / 256;
sprite->pos2.y = sprite->data5 / 256;
sprite->pos2.x = sprite->data[4] / 256;
sprite->pos2.y = sprite->data[5] / 256;
sprite->data2 += sprite->data3;
sprite->data[2] += sprite->data[3];
if (sprite->pos1.y + sprite->pos2.y > sprite->pos1.y + 20 && sprite->data2 > 0)
if (sprite->pos1.y + sprite->pos2.y > sprite->pos1.y + 20 && sprite->data[2] > 0)
DestroySprite(sprite);
}
@@ -855,19 +854,19 @@ static void CreateRandomEggShardSprite(void)
static void CreateEggShardSprite(u8 x, u8 y, s16 data1, s16 data2, s16 data3, u8 spriteAnimIndex)
{
u8 spriteID = CreateSprite(&sSpriteTemplate_EggShard, x, y, 4);
gSprites[spriteID].data1 = data1;
gSprites[spriteID].data2 = data2;
gSprites[spriteID].data3 = data3;
gSprites[spriteID].data[1] = data1;
gSprites[spriteID].data[2] = data2;
gSprites[spriteID].data[3] = data3;
StartSpriteAnim(&gSprites[spriteID], spriteAnimIndex);
}
static void EggHatchPrintMessage(u8 windowId, u8* string, u8 x, u8 y, u8 speed)
{
FillWindowPixelBuffer(windowId, 0xFF);
sEggHatchData->textColor.fgColor = 0;
sEggHatchData->textColor.bgColor = 5;
sEggHatchData->textColor.shadowColor = 6;
AddTextPrinterParametrized2(windowId, 1, x, y, 0, 0, &sEggHatchData->textColor, speed, string);
sEggHatchData->textColor[0] = 0;
sEggHatchData->textColor[1] = 5;
sEggHatchData->textColor[2] = 6;
AddTextPrinterParameterized2(windowId, 1, x, y, 0, 0, sEggHatchData->textColor, speed, string);
}
u8 GetEggStepsToSubtract(void)
@@ -888,6 +887,6 @@ u8 GetEggStepsToSubtract(void)
u16 sub_80722E0(void)
{
u16 value = sub_80D22D0();
value += sub_80C7050(6);
value += CountPartyAliveNonEggMonsExcept(6);
return value;
}
+22 -22
View File
@@ -17,11 +17,11 @@ EWRAM_DATA u16 gSpecialVar_0x8008 = 0;
EWRAM_DATA u16 gSpecialVar_0x8009 = 0;
EWRAM_DATA u16 gSpecialVar_0x800A = 0;
EWRAM_DATA u16 gSpecialVar_0x800B = 0;
EWRAM_DATA u16 gScriptResult = 0;
EWRAM_DATA u16 gScriptLastTalked = 0;
EWRAM_DATA u16 gScriptFacing = 0;
EWRAM_DATA u16 gSpecialVar_0x8012 = 0;
EWRAM_DATA u16 gSpecialVar_0x8013 = 0;
EWRAM_DATA u16 gSpecialVar_Result = 0;
EWRAM_DATA u16 gSpecialVar_LastTalked = 0;
EWRAM_DATA u16 gSpecialVar_Facing = 0;
EWRAM_DATA u16 gSpecialVar_MonBoxId = 0;
EWRAM_DATA u16 gSpecialVar_MonBoxPos = 0;
EWRAM_DATA u16 gSpecialVar_0x8014 = 0;
EWRAM_DATA static u8 gUnknown_020375FC[16] = {0};
@@ -40,11 +40,11 @@ void ClearTempFieldEventData(void)
{
memset(gSaveBlock1Ptr->flags, 0, TEMP_FLAGS_SIZE);
memset(gSaveBlock1Ptr->vars, 0, TEMP_VARS_SIZE);
FlagClear(SYS_ENC_UP_ITEM);
FlagClear(SYS_ENC_DOWN_ITEM);
FlagClear(SYS_USE_STRENGTH);
FlagClear(SYS_CTRL_OBJ_DELETE);
FlagClear(SYS_UNKNOWN_880);
FlagClear(FLAG_SYS_ENC_UP_ITEM);
FlagClear(FLAG_SYS_ENC_DOWN_ITEM);
FlagClear(FLAG_SYS_USE_STRENGTH);
FlagClear(FLAG_SYS_CTRL_OBJ_DELETE);
FlagClear(FLAG_0x880);
}
// probably had different flag splits at one point.
@@ -58,7 +58,7 @@ void DisableNationalPokedex(void)
u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX);
gSaveBlock2Ptr->pokedex.nationalMagic = 0;
*nationalDexVar = 0;
FlagClear(SYS_NATIONAL_DEX);
FlagClear(FLAG_SYS_NATIONAL_DEX);
}
void EnableNationalPokedex(void)
@@ -66,7 +66,7 @@ void EnableNationalPokedex(void)
u16 *nationalDexVar = GetVarPointer(VAR_NATIONAL_DEX);
gSaveBlock2Ptr->pokedex.nationalMagic = 0xDA;
*nationalDexVar = 0x302;
FlagSet(SYS_NATIONAL_DEX);
FlagSet(FLAG_SYS_NATIONAL_DEX);
gSaveBlock2Ptr->pokedex.unknown1 = 1;
gSaveBlock2Ptr->pokedex.order = 0;
sub_80BB358();
@@ -74,7 +74,7 @@ void EnableNationalPokedex(void)
bool32 IsNationalPokedexEnabled(void)
{
if (gSaveBlock2Ptr->pokedex.nationalMagic == 0xDA && VarGet(VAR_NATIONAL_DEX) == 0x302 && FlagGet(SYS_NATIONAL_DEX))
if (gSaveBlock2Ptr->pokedex.nationalMagic == 0xDA && VarGet(VAR_NATIONAL_DEX) == 0x302 && FlagGet(FLAG_SYS_NATIONAL_DEX))
return TRUE;
else
return FALSE;
@@ -82,32 +82,32 @@ bool32 IsNationalPokedexEnabled(void)
void DisableMysteryEvent(void)
{
FlagClear(SYS_MYSTERY_EVENT_ENABLE);
FlagClear(FLAG_SYS_MYSTERY_EVENT_ENABLE);
}
void EnableMysteryEvent(void)
{
FlagSet(SYS_MYSTERY_EVENT_ENABLE);
FlagSet(FLAG_SYS_MYSTERY_EVENT_ENABLE);
}
bool32 IsMysteryEventEnabled(void)
{
return FlagGet(SYS_MYSTERY_EVENT_ENABLE);
return FlagGet(FLAG_SYS_MYSTERY_EVENT_ENABLE);
}
void DisableMysteryGift(void)
{
FlagClear(SYS_MYSTERY_GIFT_ENABLE);
FlagClear(FLAG_SYS_MYSTERY_GIFT_ENABLE);
}
void EnableMysteryGift(void)
{
FlagSet(SYS_MYSTERY_GIFT_ENABLE);
FlagSet(FLAG_SYS_MYSTERY_GIFT_ENABLE);
}
bool32 IsMysteryGiftEnabled(void)
{
return FlagGet(SYS_MYSTERY_GIFT_ENABLE);
return FlagGet(FLAG_SYS_MYSTERY_GIFT_ENABLE);
}
void sub_809D4D8(void)
@@ -145,18 +145,18 @@ void sub_809D570(void)
void DisableResetRTC(void)
{
VarSet(VAR_RESET_RTC_ENABLE, 0);
FlagClear(SYS_RESET_RTC_ENABLE);
FlagClear(FLAG_SYS_RESET_RTC_ENABLE);
}
void EnableResetRTC(void)
{
VarSet(VAR_RESET_RTC_ENABLE, 0x920);
FlagSet(SYS_RESET_RTC_ENABLE);
FlagSet(FLAG_SYS_RESET_RTC_ENABLE);
}
bool32 CanResetRTC(void)
{
if (FlagGet(SYS_RESET_RTC_ENABLE) && VarGet(VAR_RESET_RTC_ENABLE) == 0x920)
if (FlagGet(FLAG_SYS_RESET_RTC_ENABLE) && VarGet(VAR_RESET_RTC_ENABLE) == 0x920)
return TRUE;
else
return FALSE;
+42 -42
View File
@@ -2,11 +2,11 @@
#include "evolution_graphics.h"
#include "sprite.h"
#include "trig.h"
#include "rng.h"
#include "random.h"
#include "decompress.h"
#include "task.h"
#include "sound.h"
#include "songs.h"
#include "constants/songs.h"
#include "palette.h"
// this file's functions
@@ -112,18 +112,18 @@ static void SpriteCB_PreEvoSparkleSet1(struct Sprite* sprite)
{
u8 matrixNum;
sprite->pos1.y = 88 - (sprite->data7 * sprite->data7) / 80;
sprite->pos2.y = Sin((u8)(sprite->data6), sprite->data5) / 4;
sprite->pos2.x = Cos((u8)(sprite->data6), sprite->data5);
sprite->data6 += 4;
if (sprite->data7 & 1)
sprite->data5--;
sprite->data7++;
sprite->pos1.y = 88 - (sprite->data[7] * sprite->data[7]) / 80;
sprite->pos2.y = Sin((u8)(sprite->data[6]), sprite->data[5]) / 4;
sprite->pos2.x = Cos((u8)(sprite->data[6]), sprite->data[5]);
sprite->data[6] += 4;
if (sprite->data[7] & 1)
sprite->data[5]--;
sprite->data[7]++;
if (sprite->pos2.y > 0)
sprite->subpriority = 1;
else
sprite->subpriority = 20;
matrixNum = sprite->data5 / 4 + 20;
matrixNum = sprite->data[5] / 4 + 20;
if (matrixNum > 31)
matrixNum = 31;
sprite->oam.matrixNum = matrixNum;
@@ -137,9 +137,9 @@ static void CreatePreEvoSparkleSet1(u8 arg0)
u8 spriteID = CreateSprite(&sEvoSparkleSpriteTemplate, 120, 88, 0);
if (spriteID != MAX_SPRITES)
{
gSprites[spriteID].data5 = 48;
gSprites[spriteID].data6 = arg0;
gSprites[spriteID].data7 = 0;
gSprites[spriteID].data[5] = 48;
gSprites[spriteID].data[6] = arg0;
gSprites[spriteID].data[7] = 0;
gSprites[spriteID].oam.affineMode = 1;
gSprites[spriteID].oam.matrixNum = 31;
gSprites[spriteID].callback = SpriteCB_PreEvoSparkleSet1;
@@ -150,11 +150,11 @@ static void SpriteCB_PreEvoSparkleSet2(struct Sprite* sprite)
{
if (sprite->pos1.y < 88)
{
sprite->pos1.y = 8 + (sprite->data7 * sprite->data7) / 5;
sprite->pos2.y = Sin((u8)(sprite->data6), sprite->data5) / 4;
sprite->pos2.x = Cos((u8)(sprite->data6), sprite->data5);
sprite->data5 = 8 + Sin((u8)(sprite->data7 * 4), 40);
sprite->data7++;
sprite->pos1.y = 8 + (sprite->data[7] * sprite->data[7]) / 5;
sprite->pos2.y = Sin((u8)(sprite->data[6]), sprite->data[5]) / 4;
sprite->pos2.x = Cos((u8)(sprite->data[6]), sprite->data[5]);
sprite->data[5] = 8 + Sin((u8)(sprite->data[7] * 4), 40);
sprite->data[7]++;
}
else
DestroySprite(sprite);
@@ -165,9 +165,9 @@ static void CreatePreEvoSparkleSet2(u8 arg0)
u8 spriteID = CreateSprite(&sEvoSparkleSpriteTemplate, 120, 8, 0);
if (spriteID != MAX_SPRITES)
{
gSprites[spriteID].data5 = 8;
gSprites[spriteID].data6 = arg0;
gSprites[spriteID].data7 = 0;
gSprites[spriteID].data[5] = 8;
gSprites[spriteID].data[6] = arg0;
gSprites[spriteID].data[7] = 0;
gSprites[spriteID].oam.affineMode = 1;
gSprites[spriteID].oam.matrixNum = 25;
gSprites[spriteID].subpriority = 1;
@@ -177,12 +177,12 @@ static void CreatePreEvoSparkleSet2(u8 arg0)
static void SpriteCB_PostEvoSparkleSet1(struct Sprite* sprite)
{
if (sprite->data5 > 8)
if (sprite->data[5] > 8)
{
sprite->pos2.y = Sin((u8)(sprite->data6), sprite->data5);
sprite->pos2.x = Cos((u8)(sprite->data6), sprite->data5);
sprite->data5 -= sprite->data3;
sprite->data6 += 4;
sprite->pos2.y = Sin((u8)(sprite->data[6]), sprite->data[5]);
sprite->pos2.x = Cos((u8)(sprite->data[6]), sprite->data[5]);
sprite->data[5] -= sprite->data[3];
sprite->data[6] += 4;
}
else
DestroySprite(sprite);
@@ -193,10 +193,10 @@ static void CreatePostEvoSparkleSet1(u8 arg0, u8 arg1)
u8 spriteID = CreateSprite(&sEvoSparkleSpriteTemplate, 120, 56, 0);
if (spriteID != MAX_SPRITES)
{
gSprites[spriteID].data3 = arg1;
gSprites[spriteID].data5 = 120;
gSprites[spriteID].data6 = arg0;
gSprites[spriteID].data7 = 0;
gSprites[spriteID].data[3] = arg1;
gSprites[spriteID].data[5] = 120;
gSprites[spriteID].data[6] = arg0;
gSprites[spriteID].data[7] = 0;
gSprites[spriteID].oam.affineMode = 1;
gSprites[spriteID].oam.matrixNum = 31;
gSprites[spriteID].subpriority = 1;
@@ -206,29 +206,29 @@ static void CreatePostEvoSparkleSet1(u8 arg0, u8 arg1)
static void SpriteCB_PostEvoSparkleSet2(struct Sprite* sprite)
{
if (!(sprite->data7 & 3))
if (!(sprite->data[7] & 3))
sprite->pos1.y++;
if (sprite->data6 < 128)
if (sprite->data[6] < 128)
{
u8 matrixNum;
sprite->pos2.y = -Sin((u8)(sprite->data6), sprite->data5);
sprite->pos1.x = 120 + (sprite->data3 * sprite->data7) / 3;
sprite->data6++;
matrixNum = 31 - (sprite->data6 * 12 / 128);
if (sprite->data6 > 64)
sprite->pos2.y = -Sin((u8)(sprite->data[6]), sprite->data[5]);
sprite->pos1.x = 120 + (sprite->data[3] * sprite->data[7]) / 3;
sprite->data[6]++;
matrixNum = 31 - (sprite->data[6] * 12 / 128);
if (sprite->data[6] > 64)
sprite->subpriority = 1;
else
{
sprite->invisible = 0;
sprite->subpriority = 20;
if (sprite->data6 > 112 && sprite->data6 & 1)
if (sprite->data[6] > 112 && sprite->data[6] & 1)
sprite->invisible = 1;
}
if (matrixNum < 20)
matrixNum = 20;
sprite->oam.matrixNum = matrixNum;
sprite->data7++;
sprite->data[7]++;
}
else
DestroySprite(sprite);
@@ -239,9 +239,9 @@ static void CreatePostEvoSparkleSet2(u8 arg0)
u8 spriteID = CreateSprite(&sEvoSparkleSpriteTemplate, 120, 56, 0);
if (spriteID != MAX_SPRITES)
{
gSprites[spriteID].data3 = 3 - (Random() % 7);
gSprites[spriteID].data5 = 48 + (Random() & 0x3F);
gSprites[spriteID].data7 = 0;
gSprites[spriteID].data[3] = 3 - (Random() % 7);
gSprites[spriteID].data[5] = 48 + (Random() & 0x3F);
gSprites[spriteID].data[7] = 0;
gSprites[spriteID].oam.affineMode = 1;
gSprites[spriteID].oam.matrixNum = 31;
gSprites[spriteID].subpriority = 20;
+141 -74
View File
@@ -11,16 +11,17 @@
#include "pokemon.h"
#include "string_util.h"
#include "battle.h"
#include "unknown_task.h"
#include "scanline_effect.h"
#include "decompress.h"
#include "m4a.h"
#include "menu.h"
#include "pokedex.h"
#include "species.h"
#include "constants/species.h"
#include "sound.h"
#include "songs.h"
#include "constants/songs.h"
#include "overworld.h"
#include "battle_message.h"
#include "constants/battle_string_ids.h"
#include "gpu_regs.h"
#include "bg.h"
#include "link.h"
@@ -47,27 +48,18 @@ extern u16 gBattle_BG2_X;
extern u16 gBattle_BG2_Y;
extern u16 gBattle_BG3_X;
extern u16 gBattle_BG3_Y;
extern u8 gBattleTerrain;
extern struct SpriteTemplate gUnknown_0202499C;
extern bool8 gAffineAnimsDisabled;
extern u16 gMoveToLearn;
extern const u8 gSpeciesNames[][11];
extern u8 gBattleCommunication[];
#define sEvoCursorPos gBattleCommunication[1] // when learning a new move
#define sEvoGraphicsTaskID gBattleCommunication[2]
extern const struct WindowTemplate gUnknown_0833900C;
extern const struct CompressedSpriteSheet gMonFrontPicTable[];
extern const u8 gUnknown_085B58C9[][4];
extern const u16 gUnknown_085B5884[];
extern const u8 gUnknown_085B58D9[];
extern const u16 gUnknown_085B51E4[];
extern const u32 gUnknown_085B4134[];
extern const u32 gUnknown_085B482C[];
extern const u32 gUnknown_085B4D10[];
// strings
extern const u8 gText_ShedinjaJapaneseName2[];
extern const u8 gText_PkmnIsEvolving[];
extern const u8 gText_CongratsPkmnEvolved[];
extern const u8 gText_BattleYesNoChoice[];
@@ -84,7 +76,7 @@ extern void sub_806A068(u16, u8);
extern void sub_807F19C(void);
extern void sub_807B140(void);
extern void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies);
extern void sub_8085784(void);
extern void Overworld_PlaySpecialMapMusic(void);
extern void sub_81BFA38(struct Pokemon *party, u8 monId, u8 partyCount, void *CB2_ptr, u16 move);
extern u8 sub_81C1B94(void);
extern void sub_807F1A8(u8 arg0, const u8 *arg1, u8 arg2);
@@ -106,6 +98,80 @@ static void InitMovingBackgroundTask(bool8 isLink);
static void sub_813FEE8(u8 taskId);
static void sub_8140174(void);
// const data
static const u16 sUnknown_085B4114[] = INCBIN_U16("graphics/evolution_scene/unknown_5B4114.gbapal");
static const u32 sUnknown_085B4134[] = INCBIN_U32("graphics/evolution_scene/bg.4bpp.lz");
static const u32 sUnknown_085B482C[] = INCBIN_U32("graphics/evolution_scene/bg.bin.lz");
static const u32 sUnknown_085B4D10[] = INCBIN_U32("graphics/evolution_scene/bg2.bin.lz");
static const u16 sUnknown_085B51E4[] = INCBIN_U16("graphics/evolution_scene/gray_transition_intro.gbapal");
static const u16 sUnknown_085B53E4[] = INCBIN_U16("graphics/evolution_scene/gray_transition_lighten.gbapal");
static const u16 sUnknown_085B5544[] = INCBIN_U16("graphics/evolution_scene/gray_transition_darken.gbapal");
static const u16 sUnknown_085B56E4[] = INCBIN_U16("graphics/evolution_scene/gray_transition_outro.gbapal");
static const u16 sUnknown_085B5884[] = INCBIN_U16("graphics/evolution_scene/transition.gbapal");
static const u8 Text_ShedinjaJapaneseName[] = _("ヌケニン");
static const u8 sUnknown_085B58C9[][4] =
{
{ 0x00, 0x0C, 0x01, 0x06 },
{ 0x0D, 0x24, 0x05, 0x02 },
{ 0x0D, 0x18, 0x01, 0x02 },
{ 0x25, 0x31, 0x01, 0x06 },
};
static const u8 sUnknown_085B58D9[][16] = {
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0x0B, 0x00, 0x00 },
{ 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x00, 0x00 },
{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x00, 0x00 },
{ 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x00, 0x00 },
{ 0x00, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x0B, 0x00, 0x00 },
{ 0x00, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x0B, 0x0A, 0x00, 0x00 },
{ 0x00, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x00, 0x00 },
{ 0x00, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x00, 0x00 },
{ 0x00, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x00, 0x00 },
{ 0x00, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x00, 0x00 },
{ 0x00, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x00, 0x00 },
{ 0x00, 0x0A, 0x0B, 0x0C, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x00, 0x00 },
{ 0x00, 0x0B, 0x0C, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x00, 0x00 },
{ 0x00, 0x0C, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x00, 0x00 },
{ 0x00, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00 },
{ 0x00, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x02, 0x00, 0x00 },
{ 0x00, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x02, 0x03, 0x00, 0x00 },
{ 0x00, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x02, 0x03, 0x04, 0x00, 0x00 },
{ 0x00, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x00 },
{ 0x00, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x00, 0x00 },
{ 0x00, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x00, 0x00 },
{ 0x00, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, 0x00 },
{ 0x00, 0x05, 0x04, 0x03, 0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0x00 },
{ 0x00, 0x04, 0x03, 0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x00, 0x00 },
{ 0x00, 0x03, 0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x00, 0x00 },
{ 0x00, 0x02, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x00, 0x00 },
{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x00, 0x00 },
{ 0x00, 0x0C, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00 },
{ 0x00, 0x0B, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x0A, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
};
static void CB2_BeginEvolutionScene(void)
{
UpdatePaletteFade();
@@ -201,7 +267,7 @@ void EvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, bool8 canStopEvo,
sub_80356D0();
LoadBattleTextboxAndBackground();
ResetSpriteData();
remove_some_task();
ScanlineEffect_Stop();
ResetTasks();
FreeAllSpritePalettes();
@@ -507,16 +573,16 @@ static void CB2_TradeEvolutionSceneUpdate(void)
static void CreateShedinja(u16 preEvoSpecies, struct Pokemon* mon)
{
u32 data = 0;
if (gEvolutionTable[preEvoSpecies].evolutions[0].method == EVO_LEVEL_NINJASK && gPlayerPartyCount < 6)
if (gEvolutionTable[preEvoSpecies][0].method == EVO_LEVEL_NINJASK && gPlayerPartyCount < 6)
{
s32 i;
struct Pokemon* Shedinja = &gPlayerParty[gPlayerPartyCount];
const struct EvolutionData* evoTable;
const struct EvolutionData* evos;
struct Pokemon* shedinja = &gPlayerParty[gPlayerPartyCount];
const struct Evolution *evos;
const struct Evolution *evos2;
CopyMon(&gPlayerParty[gPlayerPartyCount], mon, sizeof(struct Pokemon));
SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, (&gEvolutionTable[preEvoSpecies].evolutions[1].targetSpecies));
SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_NICKNAME, (gSpeciesNames[gEvolutionTable[preEvoSpecies].evolutions[1].targetSpecies]));
SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, (&gEvolutionTable[preEvoSpecies][1].targetSpecies));
SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_NICKNAME, (gSpeciesNames[gEvolutionTable[preEvoSpecies][1].targetSpecies]));
SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_HELD_ITEM, (&data));
SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_MARKINGS, (&data));
SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_10, (&data));
@@ -534,15 +600,16 @@ static void CreateShedinja(u16 preEvoSpecies, struct Pokemon* mon)
CalculatePlayerPartyCount();
// can't match it otherwise, ehh
evoTable = gEvolutionTable;
evos = evoTable + preEvoSpecies;
GetSetPokedexFlag(SpeciesToNationalPokedexNum(evos->evolutions[1].targetSpecies), FLAG_SET_SEEN);
GetSetPokedexFlag(SpeciesToNationalPokedexNum(evos->evolutions[1].targetSpecies), FLAG_SET_CAUGHT);
evos2 = gEvolutionTable[0];
evos = evos2 + EVOS_PER_MON * preEvoSpecies;
if (GetMonData(Shedinja, MON_DATA_SPECIES) == SPECIES_SHEDINJA
&& GetMonData(Shedinja, MON_DATA_LANGUAGE) == LANGUAGE_JAPANESE
GetSetPokedexFlag(SpeciesToNationalPokedexNum(evos[1].targetSpecies), FLAG_SET_SEEN);
GetSetPokedexFlag(SpeciesToNationalPokedexNum(evos[1].targetSpecies), FLAG_SET_CAUGHT);
if (GetMonData(shedinja, MON_DATA_SPECIES) == SPECIES_SHEDINJA
&& GetMonData(shedinja, MON_DATA_LANGUAGE) == LANGUAGE_JAPANESE
&& GetMonData(mon, MON_DATA_SPECIES) == SPECIES_NINJASK)
SetMonData(Shedinja, MON_DATA_NICKNAME, gText_ShedinjaJapaneseName2);
SetMonData(shedinja, MON_DATA_NICKNAME, Text_ShedinjaJapaneseName);
}
}
@@ -592,14 +659,14 @@ static void Task_EvolutionScene(u8 taskID)
case 3:
if (EvoScene_IsMonAnimFinished(sEvoStructPtr->preEvoSpriteID)) // wait for animation, play tu du SE
{
PlaySE(BGM_ME_SHINKA);
PlaySE(MUS_ME_SHINKA);
gTasks[taskID].tState++;
}
break;
case 4: // play evolution music and fade screen black
if (!IsSEPlaying())
{
PlayNewMapMusic(BGM_SHINKA);
PlayNewMapMusic(MUS_SHINKA);
gTasks[taskID].tState++;
BeginNormalPaletteFade(0x1C, 4, 0, 0x10, 0);
}
@@ -675,7 +742,7 @@ static void Task_EvolutionScene(u8 taskID)
{
StringExpandPlaceholders(gStringVar4, gText_CongratsPkmnEvolved);
BattleHandleAddTextPrinter(gStringVar4, 0);
PlayBGM(BGM_FANFA5);
PlayBGM(MUS_FANFA5);
gTasks[taskID].tState++;
SetMonData(mon, MON_DATA_SPECIES, (void*)(&gTasks[taskID].tPostEvoSpecies));
CalculateMonStats(mon);
@@ -696,7 +763,7 @@ static void Task_EvolutionScene(u8 taskID)
if (!(gTasks[taskID].tBits & TASK_BIT_LEARN_MOVE))
{
StopMapMusic();
sub_8085784();
Overworld_PlaySpecialMapMusic();
}
gTasks[taskID].tBits |= TASK_BIT_LEARN_MOVE;
@@ -725,7 +792,7 @@ static void Task_EvolutionScene(u8 taskID)
if (!(gTasks[taskID].tBits & TASK_BIT_LEARN_MOVE))
{
StopMapMusic();
sub_8085784();
Overworld_PlaySpecialMapMusic();
}
if (!gTasks[taskID].tEvoWasStopped)
CreateShedinja(gTasks[taskID].tPreEvoSpecies, mon);
@@ -770,8 +837,8 @@ static void Task_EvolutionScene(u8 taskID)
if (!IsTextPrinterActive(0) && !IsSEPlaying())
{
BufferMoveToLearnIntoBattleTextBuff2();
PlayFanfare(BGM_FANFA1);
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[3]);
PlayFanfare(MUS_FANFA1);
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNLEARNEDMOVE - BATTLESTRINGS_ID_ADDER]);
BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
gTasks[taskID].tLearnsFirstMove = 0x40; // re-used as a counter
gTasks[taskID].tState++;
@@ -788,7 +855,7 @@ static void Task_EvolutionScene(u8 taskID)
if (!IsTextPrinterActive(0) && !IsSEPlaying())
{
BufferMoveToLearnIntoBattleTextBuff2();
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[4]);
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE1 - BATTLESTRINGS_ID_ADDER]);
BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
gTasks[taskID].tLearnMoveState++;
}
@@ -796,7 +863,7 @@ static void Task_EvolutionScene(u8 taskID)
case 1:
if (!IsTextPrinterActive(0) && !IsSEPlaying())
{
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[5]);
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE2 - BATTLESTRINGS_ID_ADDER]);
BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
gTasks[taskID].tLearnMoveState++;
}
@@ -804,7 +871,7 @@ static void Task_EvolutionScene(u8 taskID)
case 2:
if (!IsTextPrinterActive(0) && !IsSEPlaying())
{
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[6]);
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE3 - BATTLESTRINGS_ID_ADDER]);
BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
gTasks[taskID].tData7 = 5;
gTasks[taskID].tData8 = 10;
@@ -881,7 +948,7 @@ static void Task_EvolutionScene(u8 taskID)
u16 move = GetMonData(mon, var + MON_DATA_MOVE1);
if (IsHMMove2(move))
{
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[307]);
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_HMMOVESCANTBEFORGOTTEN - BATTLESTRINGS_ID_ADDER]);
BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
gTasks[taskID].tLearnMoveState = 12;
}
@@ -897,14 +964,14 @@ static void Task_EvolutionScene(u8 taskID)
}
break;
case 7:
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[207]);
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_123POOF - BATTLESTRINGS_ID_ADDER]);
BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
gTasks[taskID].tLearnMoveState++;
break;
case 8:
if (!IsTextPrinterActive(0) && !IsSEPlaying())
{
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[7]);
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNFORGOTMOVE - BATTLESTRINGS_ID_ADDER]);
BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
gTasks[taskID].tLearnMoveState++;
}
@@ -912,20 +979,20 @@ static void Task_EvolutionScene(u8 taskID)
case 9:
if (!IsTextPrinterActive(0) && !IsSEPlaying())
{
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[208]);
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_ANDELLIPSIS - BATTLESTRINGS_ID_ADDER]);
BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
gTasks[taskID].tState = 20;
}
break;
case 10:
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[8]);
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_STOPLEARNINGMOVE - BATTLESTRINGS_ID_ADDER]);
BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
gTasks[taskID].tData7 = 11;
gTasks[taskID].tData8 = 0;
gTasks[taskID].tLearnMoveState = 3;
break;
case 11:
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[9]);
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_DIDNOTLEARNMOVE - BATTLESTRINGS_ID_ADDER]);
BattleHandleAddTextPrinter(gDisplayedStringBattle, 0);
gTasks[taskID].tState = 15;
break;
@@ -960,15 +1027,15 @@ static void Task_TradeEvolutionScene(u8 taskID)
case 2:
if (IsCryFinished())
{
m4aSongNumStop(BGM_SHINKA);
PlaySE(BGM_ME_SHINKA);
m4aSongNumStop(MUS_SHINKA);
PlaySE(MUS_ME_SHINKA);
gTasks[taskID].tState++;
}
break;
case 3:
if (!IsSEPlaying())
{
PlayBGM(BGM_SHINKA);
PlayBGM(MUS_SHINKA);
gTasks[taskID].tState++;
BeginNormalPaletteFade(0x1C, 4, 0, 0x10, 0);
}
@@ -1038,7 +1105,7 @@ static void Task_TradeEvolutionScene(u8 taskID)
{
StringExpandPlaceholders(gStringVar4, gText_CongratsPkmnEvolved);
sub_807F1A8(0, gStringVar4, 1);
PlayFanfare(BGM_FANFA5);
PlayFanfare(MUS_FANFA5);
gTasks[taskID].tState++;
SetMonData(mon, MON_DATA_SPECIES, (&gTasks[taskID].tPostEvoSpecies));
CalculateMonStats(mon);
@@ -1071,7 +1138,7 @@ static void Task_TradeEvolutionScene(u8 taskID)
}
else
{
PlayBGM(BGM_SHINKA);
PlayBGM(MUS_SHINKA);
sub_807F1A8(0, gText_CommunicationStandby5, 1);
gTasks[taskID].tState++;
}
@@ -1115,8 +1182,8 @@ static void Task_TradeEvolutionScene(u8 taskID)
if (!IsTextPrinterActive(0) && !IsSEPlaying())
{
BufferMoveToLearnIntoBattleTextBuff2();
PlayFanfare(BGM_FANFA1);
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[3]);
PlayFanfare(MUS_FANFA1);
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNLEARNEDMOVE - BATTLESTRINGS_ID_ADDER]);
sub_807F1A8(0, gDisplayedStringBattle, 1);
gTasks[taskID].tLearnsFirstMove = 0x40; // re-used as a counter
gTasks[taskID].tState++;
@@ -1133,7 +1200,7 @@ static void Task_TradeEvolutionScene(u8 taskID)
if (!IsTextPrinterActive(0) && !IsSEPlaying())
{
BufferMoveToLearnIntoBattleTextBuff2();
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[4]);
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE1 - BATTLESTRINGS_ID_ADDER]);
sub_807F1A8(0, gDisplayedStringBattle, 1);
gTasks[taskID].tLearnMoveState++;
}
@@ -1141,7 +1208,7 @@ static void Task_TradeEvolutionScene(u8 taskID)
case 1:
if (!IsTextPrinterActive(0) && !IsSEPlaying())
{
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[5]);
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE2 - BATTLESTRINGS_ID_ADDER]);
sub_807F1A8(0, gDisplayedStringBattle, 1);
gTasks[taskID].tLearnMoveState++;
}
@@ -1149,7 +1216,7 @@ static void Task_TradeEvolutionScene(u8 taskID)
case 2:
if (!IsTextPrinterActive(0) && !IsSEPlaying())
{
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[6]);
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_TRYTOLEARNMOVE3 - BATTLESTRINGS_ID_ADDER]);
sub_807F1A8(0, gDisplayedStringBattle, 1);
gTasks[taskID].tData7 = 5;
gTasks[taskID].tData8 = 9;
@@ -1166,11 +1233,11 @@ static void Task_TradeEvolutionScene(u8 taskID)
}
break;
case 4:
switch (sub_8198C58())
switch (ProcessMenuInputNoWrap_())
{
case 0:
sEvoCursorPos = 0;
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[292]);
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_EMPTYSTRING3 - BATTLESTRINGS_ID_ADDER]);
sub_807F1A8(0, gDisplayedStringBattle, 1);
gTasks[taskID].tLearnMoveState = gTasks[taskID].tData7;
if (gTasks[taskID].tLearnMoveState == 5)
@@ -1179,7 +1246,7 @@ static void Task_TradeEvolutionScene(u8 taskID)
case 1:
case -1:
sEvoCursorPos = 1;
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[292]);
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_EMPTYSTRING3 - BATTLESTRINGS_ID_ADDER]);
sub_807F1A8(0, gDisplayedStringBattle, 1);
gTasks[taskID].tLearnMoveState = gTasks[taskID].tData8;
break;
@@ -1215,7 +1282,7 @@ static void Task_TradeEvolutionScene(u8 taskID)
u16 move = GetMonData(mon, var + MON_DATA_MOVE1);
if (IsHMMove2(move))
{
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[307]);
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_HMMOVESCANTBEFORGOTTEN - BATTLESTRINGS_ID_ADDER]);
sub_807F1A8(0, gDisplayedStringBattle, 1);
gTasks[taskID].tLearnMoveState = 11;
}
@@ -1225,7 +1292,7 @@ static void Task_TradeEvolutionScene(u8 taskID)
RemoveMonPPBonus(mon, var);
SetMonMoveSlot(mon, gMoveToLearn, var);
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[207]);
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_123POOF - BATTLESTRINGS_ID_ADDER]);
sub_807F1A8(0, gDisplayedStringBattle, 1);
gTasks[taskID].tLearnMoveState++;
}
@@ -1235,7 +1302,7 @@ static void Task_TradeEvolutionScene(u8 taskID)
case 7:
if (!IsTextPrinterActive(0) && !IsSEPlaying())
{
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[7]);
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_PKMNFORGOTMOVE - BATTLESTRINGS_ID_ADDER]);
sub_807F1A8(0, gDisplayedStringBattle, 1);
gTasks[taskID].tLearnMoveState++;
}
@@ -1243,20 +1310,20 @@ static void Task_TradeEvolutionScene(u8 taskID)
case 8:
if (!IsTextPrinterActive(0) && !IsSEPlaying())
{
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[208]);
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_ANDELLIPSIS - BATTLESTRINGS_ID_ADDER]);
sub_807F1A8(0, gDisplayedStringBattle, 1);
gTasks[taskID].tState = 18;
}
break;
case 9:
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[8]);
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_STOPLEARNINGMOVE - BATTLESTRINGS_ID_ADDER]);
sub_807F1A8(0, gDisplayedStringBattle, 1);
gTasks[taskID].tData7 = 10;
gTasks[taskID].tData8 = 0;
gTasks[taskID].tLearnMoveState = 3;
break;
case 10:
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[9]);
BattleStringExpandPlaceholdersToDisplayedString(gBattleStringsTable[STRINGID_DIDNOTLEARNMOVE - BATTLESTRINGS_ID_ADDER]);
sub_807F1A8(0, gDisplayedStringBattle, 1);
gTasks[taskID].tState = 13;
break;
@@ -1299,7 +1366,7 @@ static void VBlankCB_EvolutionScene(void)
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
sub_80BA0A8();
ScanlineEffect_InitHBlankDmaTransfer();
}
static void VBlankCB_TradeEvolutionScene(void)
@@ -1316,7 +1383,7 @@ static void VBlankCB_TradeEvolutionScene(void)
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
sub_80BA0A8();
ScanlineEffect_InitHBlankDmaTransfer();
}
static void sub_813FDEC(u8 taskId)
@@ -1328,17 +1395,17 @@ static void sub_813FDEC(u8 taskId)
if (data[5]++ < 20)
return;
if (data[0]++ > gUnknown_085B58C9[data[2]][3])
if (data[0]++ > sUnknown_085B58C9[data[2]][3])
{
if (gUnknown_085B58C9[data[2]][1] == data[1])
if (sUnknown_085B58C9[data[2]][1] == data[1])
{
data[3]++;
if (data[3] == gUnknown_085B58C9[data[2]][2])
if (data[3] == sUnknown_085B58C9[data[2]][2])
{
data[3] = 0;
data[2]++;
}
data[1] = gUnknown_085B58C9[data[2]][0];
data[1] = sUnknown_085B58C9[data[2]][0];
}
else
{
@@ -1409,7 +1476,7 @@ static void InitMovingBgValues(u16 *movingBgs)
{
for (j = 0; j < 16; j++)
{
movingBgs[i * 16 + j] = gUnknown_085B5884[gUnknown_085B58D9[i * 16 + j]];
movingBgs[i * 16 + j] = sUnknown_085B5884[sUnknown_085B58D9[i][j]];
}
}
}
@@ -1426,11 +1493,11 @@ static void InitMovingBackgroundTask(bool8 isLink)
else
innerBgId = 1, outerBgId = 3;
LoadPalette(gUnknown_085B51E4, 0xA0, 0x20);
LoadPalette(sUnknown_085B51E4, 0xA0, 0x20);
copy_decompressed_tile_data_to_vram_autofree(1, gUnknown_085B4134, FALSE, 0, 0);
CopyToBgTilemapBuffer(1, gUnknown_085B482C, 0, 0);
CopyToBgTilemapBuffer(outerBgId, gUnknown_085B4D10, 0, 0);
copy_decompressed_tile_data_to_vram_autofree(1, sUnknown_085B4134, FALSE, 0, 0);
CopyToBgTilemapBuffer(1, sUnknown_085B482C, 0, 0);
CopyToBgTilemapBuffer(outerBgId, sUnknown_085B4D10, 0, 0);
CopyBgTilemapBufferToVram(1);
CopyBgTilemapBufferToVram(outerBgId);
+898
View File
@@ -0,0 +1,898 @@
#include "global.h"
#include "field_door.h"
#include "field_camera.h"
#include "fieldmap.h"
#include "metatile_behavior.h"
#include "event_data.h"
#include "constants/songs.h"
#include "constants/flags.h"
#include "constants/maps.h"
#include "task.h"
bool8 sub_808A964(void);
const u8 DoorAnimTiles_04[][0x100] =
{
INCBIN_U8("graphics/door_anims/04/0.4bpp"),
INCBIN_U8("graphics/door_anims/04/1.4bpp"),
INCBIN_U8("graphics/door_anims/04/2.4bpp"),
};
// TODO: Make these blank palette includes?
asm(".space 32");
const u8 DoorAnimTiles_05[][0x100] =
{
INCBIN_U8("graphics/door_anims/05/0.4bpp"),
INCBIN_U8("graphics/door_anims/05/1.4bpp"),
INCBIN_U8("graphics/door_anims/05/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_08[][0x100] =
{
INCBIN_U8("graphics/door_anims/08/0.4bpp"),
INCBIN_U8("graphics/door_anims/08/1.4bpp"),
INCBIN_U8("graphics/door_anims/08/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_15[][0x100] =
{
INCBIN_U8("graphics/door_anims/15/0.4bpp"),
INCBIN_U8("graphics/door_anims/15/1.4bpp"),
INCBIN_U8("graphics/door_anims/15/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_16[][0x100] =
{
INCBIN_U8("graphics/door_anims/16/0.4bpp"),
INCBIN_U8("graphics/door_anims/16/1.4bpp"),
INCBIN_U8("graphics/door_anims/16/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_00[][0x100] =
{
INCBIN_U8("graphics/door_anims/00/0.4bpp"),
INCBIN_U8("graphics/door_anims/00/1.4bpp"),
INCBIN_U8("graphics/door_anims/00/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_01[][0x100] =
{
INCBIN_U8("graphics/door_anims/01/0.4bpp"),
INCBIN_U8("graphics/door_anims/01/1.4bpp"),
INCBIN_U8("graphics/door_anims/01/2.4bpp"),
};
const u8 DoorAnimTiles_02[][0x100] =
{
INCBIN_U8("graphics/door_anims/02/0.4bpp"),
INCBIN_U8("graphics/door_anims/02/1.4bpp"),
INCBIN_U8("graphics/door_anims/02/2.4bpp"),
};
const u8 DoorAnimTiles_03[][0x100] =
{
INCBIN_U8("graphics/door_anims/03/0.4bpp"),
INCBIN_U8("graphics/door_anims/03/1.4bpp"),
INCBIN_U8("graphics/door_anims/03/2.4bpp"),
};
const u8 DoorAnimTiles_06[][0x100] =
{
INCBIN_U8("graphics/door_anims/06/0.4bpp"),
INCBIN_U8("graphics/door_anims/06/1.4bpp"),
INCBIN_U8("graphics/door_anims/06/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_07[][0x100] =
{
INCBIN_U8("graphics/door_anims/07/0.4bpp"),
INCBIN_U8("graphics/door_anims/07/1.4bpp"),
INCBIN_U8("graphics/door_anims/07/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_09[][0x100] =
{
INCBIN_U8("graphics/door_anims/09/0.4bpp"),
INCBIN_U8("graphics/door_anims/09/1.4bpp"),
INCBIN_U8("graphics/door_anims/09/2.4bpp"),
};
asm(".space 0x5900");
const u8 DoorAnimTiles_UnusedTops[][0x40] =
{
INCBIN_U8("graphics/door_anims/unused_848EDEC/0_top.4bpp"),
INCBIN_U8("graphics/door_anims/unused_848EDEC/1_top.4bpp"),
INCBIN_U8("graphics/door_anims/unused_848EDEC/2_top.4bpp"),
};
asm(".space 0x140");
const u8 DoorAnimTiles_UnusedBottoms[][0x40] =
{
INCBIN_U8("graphics/door_anims/unused_848EDEC/0_bottom.4bpp"),
INCBIN_U8("graphics/door_anims/unused_848EDEC/1_bottom.4bpp"),
INCBIN_U8("graphics/door_anims/unused_848EDEC/2_bottom.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_10[][0x100] =
{
INCBIN_U8("graphics/door_anims/10/0.4bpp"),
INCBIN_U8("graphics/door_anims/10/1.4bpp"),
INCBIN_U8("graphics/door_anims/10/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_11[][0x100] =
{
INCBIN_U8("graphics/door_anims/11/0.4bpp"),
INCBIN_U8("graphics/door_anims/11/1.4bpp"),
INCBIN_U8("graphics/door_anims/11/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_12[][0x100] =
{
INCBIN_U8("graphics/door_anims/12/0.4bpp"),
INCBIN_U8("graphics/door_anims/12/1.4bpp"),
INCBIN_U8("graphics/door_anims/12/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_13[][0x100] =
{
INCBIN_U8("graphics/door_anims/13/0.4bpp"),
INCBIN_U8("graphics/door_anims/13/1.4bpp"),
INCBIN_U8("graphics/door_anims/13/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_14[][0x100] =
{
INCBIN_U8("graphics/door_anims/14/0.4bpp"),
INCBIN_U8("graphics/door_anims/14/1.4bpp"),
INCBIN_U8("graphics/door_anims/14/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_17[][0x100] =
{
INCBIN_U8("graphics/door_anims/17/0.4bpp"),
INCBIN_U8("graphics/door_anims/17/1.4bpp"),
INCBIN_U8("graphics/door_anims/17/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_18[][0x100] =
{
INCBIN_U8("graphics/door_anims/18/0.4bpp"),
INCBIN_U8("graphics/door_anims/18/1.4bpp"),
INCBIN_U8("graphics/door_anims/18/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_19[][0x100] =
{
INCBIN_U8("graphics/door_anims/19/0.4bpp"),
INCBIN_U8("graphics/door_anims/19/1.4bpp"),
INCBIN_U8("graphics/door_anims/19/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_20[][0x100] =
{
INCBIN_U8("graphics/door_anims/20/0.4bpp"),
INCBIN_U8("graphics/door_anims/20/1.4bpp"),
INCBIN_U8("graphics/door_anims/20/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_21[][0x100] =
{
INCBIN_U8("graphics/door_anims/21/0.4bpp"),
INCBIN_U8("graphics/door_anims/21/1.4bpp"),
INCBIN_U8("graphics/door_anims/21/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_22[][0x100] =
{
INCBIN_U8("graphics/door_anims/22/0.4bpp"),
INCBIN_U8("graphics/door_anims/22/1.4bpp"),
INCBIN_U8("graphics/door_anims/22/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_23[][0x100] =
{
INCBIN_U8("graphics/door_anims/23/0.4bpp"),
INCBIN_U8("graphics/door_anims/23/1.4bpp"),
INCBIN_U8("graphics/door_anims/23/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_24[][0x100] =
{
INCBIN_U8("graphics/door_anims/24/0.4bpp"),
INCBIN_U8("graphics/door_anims/24/1.4bpp"),
INCBIN_U8("graphics/door_anims/24/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_25[][0x100] =
{
INCBIN_U8("graphics/door_anims/25/0.4bpp"),
INCBIN_U8("graphics/door_anims/25/1.4bpp"),
INCBIN_U8("graphics/door_anims/25/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_26[][0x100] =
{
INCBIN_U8("graphics/door_anims/26/0.4bpp"),
INCBIN_U8("graphics/door_anims/26/1.4bpp"),
INCBIN_U8("graphics/door_anims/26/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_27[][0x100] =
{
INCBIN_U8("graphics/door_anims/27/0.4bpp"),
INCBIN_U8("graphics/door_anims/27/1.4bpp"),
INCBIN_U8("graphics/door_anims/27/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_28[][0x100] =
{
INCBIN_U8("graphics/door_anims/28/0.4bpp"),
INCBIN_U8("graphics/door_anims/28/1.4bpp"),
INCBIN_U8("graphics/door_anims/28/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_29[][0x100] =
{
INCBIN_U8("graphics/door_anims/29/0.4bpp"),
INCBIN_U8("graphics/door_anims/29/1.4bpp"),
INCBIN_U8("graphics/door_anims/29/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_30[][0x100] =
{
INCBIN_U8("graphics/door_anims/30/0.4bpp"),
INCBIN_U8("graphics/door_anims/30/1.4bpp"),
INCBIN_U8("graphics/door_anims/30/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_31[][0x100] =
{
INCBIN_U8("graphics/door_anims/31/0.4bpp"),
INCBIN_U8("graphics/door_anims/31/1.4bpp"),
INCBIN_U8("graphics/door_anims/31/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_32[][0x100] =
{
INCBIN_U8("graphics/door_anims/32/0.4bpp"),
INCBIN_U8("graphics/door_anims/32/1.4bpp"),
INCBIN_U8("graphics/door_anims/32/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_33[][0x100] =
{
INCBIN_U8("graphics/door_anims/33/0.4bpp"),
INCBIN_U8("graphics/door_anims/33/1.4bpp"),
INCBIN_U8("graphics/door_anims/33/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_34[][0x100] =
{
INCBIN_U8("graphics/door_anims/34/0.4bpp"),
INCBIN_U8("graphics/door_anims/34/1.4bpp"),
INCBIN_U8("graphics/door_anims/34/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_35[][0x100] =
{
INCBIN_U8("graphics/door_anims/35/0.4bpp"),
INCBIN_U8("graphics/door_anims/35/1.4bpp"),
INCBIN_U8("graphics/door_anims/35/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_36[][0x100] =
{
INCBIN_U8("graphics/door_anims/36/0.4bpp"),
INCBIN_U8("graphics/door_anims/36/1.4bpp"),
INCBIN_U8("graphics/door_anims/36/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_37[][0x100] =
{
INCBIN_U8("graphics/door_anims/37/0.4bpp"),
INCBIN_U8("graphics/door_anims/37/1.4bpp"),
INCBIN_U8("graphics/door_anims/37/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_38[][0x100] =
{
INCBIN_U8("graphics/door_anims/38/0.4bpp"),
INCBIN_U8("graphics/door_anims/38/1.4bpp"),
INCBIN_U8("graphics/door_anims/38/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_39[][0x100] =
{
INCBIN_U8("graphics/door_anims/39/0.4bpp"),
INCBIN_U8("graphics/door_anims/39/1.4bpp"),
INCBIN_U8("graphics/door_anims/39/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_40[][0x100] =
{
INCBIN_U8("graphics/door_anims/40/0.4bpp"),
INCBIN_U8("graphics/door_anims/40/1.4bpp"),
INCBIN_U8("graphics/door_anims/40/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_41[][0x100] =
{
INCBIN_U8("graphics/door_anims/41/0.4bpp"),
INCBIN_U8("graphics/door_anims/41/1.4bpp"),
INCBIN_U8("graphics/door_anims/41/2.4bpp"),
};
const u8 DoorAnimTiles_42[][0x100] =
{
INCBIN_U8("graphics/door_anims/42/0.4bpp"),
INCBIN_U8("graphics/door_anims/42/1.4bpp"),
INCBIN_U8("graphics/door_anims/42/2.4bpp"),
INCBIN_U8("graphics/door_anims/42/3.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_43[][0x100] =
{
INCBIN_U8("graphics/door_anims/43/0.4bpp"),
INCBIN_U8("graphics/door_anims/43/1.4bpp"),
INCBIN_U8("graphics/door_anims/43/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_44[][0x100] =
{
INCBIN_U8("graphics/door_anims/44/0_left.4bpp"),
INCBIN_U8("graphics/door_anims/44/0_right.4bpp"),
INCBIN_U8("graphics/door_anims/44/1_left.4bpp"),
INCBIN_U8("graphics/door_anims/44/1_right.4bpp"),
INCBIN_U8("graphics/door_anims/44/2_left.4bpp"),
INCBIN_U8("graphics/door_anims/44/2_right.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_45[][0x100] =
{
INCBIN_U8("graphics/door_anims/45/0.4bpp"),
INCBIN_U8("graphics/door_anims/45/1.4bpp"),
INCBIN_U8("graphics/door_anims/45/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_46[][0x100] =
{
INCBIN_U8("graphics/door_anims/46/0.4bpp"),
INCBIN_U8("graphics/door_anims/46/1.4bpp"),
INCBIN_U8("graphics/door_anims/46/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_47[][0x100] =
{
INCBIN_U8("graphics/door_anims/47/0.4bpp"),
INCBIN_U8("graphics/door_anims/47/1.4bpp"),
INCBIN_U8("graphics/door_anims/47/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_48[][0x100] =
{
INCBIN_U8("graphics/door_anims/48/0.4bpp"),
INCBIN_U8("graphics/door_anims/48/1.4bpp"),
INCBIN_U8("graphics/door_anims/48/2.4bpp"),
INCBIN_U8("graphics/door_anims/48/3.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_49[][0x100] =
{
INCBIN_U8("graphics/door_anims/49/0.4bpp"),
INCBIN_U8("graphics/door_anims/49/1.4bpp"),
INCBIN_U8("graphics/door_anims/49/2.4bpp"),
};
asm(".space 32");
const u8 DoorAnimTiles_50[][0x100] =
{
INCBIN_U8("graphics/door_anims/50/0.4bpp"),
INCBIN_U8("graphics/door_anims/50/1.4bpp"),
INCBIN_U8("graphics/door_anims/50/2.4bpp"),
};
asm(".space 32");
static const struct DoorAnimFrame gDoorOpenAnimFrames[] =
{
{4, -1},
{4, 0},
{4, 0x100},
{4, 0x200},
{0, 0},
};
static const struct DoorAnimFrame gDoorCloseAnimFrames[] =
{
{4, 0x200},
{4, 0x100},
{4, 0},
{4, -1},
{0, 0},
};
static const struct DoorAnimFrame gBigDoorOpenAnimFrames[] =
{
{4, -1},
{4, 0},
{4, 0x200},
{4, 0x400},
{0, 0},
};
static const struct DoorAnimFrame gBigDoorCloseAnimFrames[] =
{
{4, 0x400},
{4, 0x200},
{4, 0},
{4, -1},
{0, 0},
};
const u8 DoorAnimPalettes_8496FDC[] = {1, 1, 1, 1, 1, 1, 1, 1}; // door 00
const u8 DoorAnimPalettes_8496FE4[] = {1, 1, 1, 1, 1, 1, 1, 1}; // door 01
const u8 DoorAnimPalettes_8496FEC[] = {5, 5, 5, 5, 5, 5, 5, 5}; // door 02
const u8 DoorAnimPalettes_8496FF4[] = {0, 0, 1, 1, 1, 1, 1, 1}; // door 03
const u8 DoorAnimPalettes_8496FFC[] = {10, 10, 6, 6, 6, 6, 6, 6}; // door 04
const u8 DoorAnimPalettes_8497004[] = {8, 8, 8, 8, 8, 8, 8, 8}; // door 05
const u8 DoorAnimPalettes_849700C[] = {11, 11, 11, 11, 11, 11, 11, 11}; // door 06
const u8 DoorAnimPalettes_8497014[] = {10, 10, 10, 10, 10, 10, 10, 10}; // door 07
const u8 DoorAnimPalettes_849701C[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 08
const u8 DoorAnimPalettes_8497024[] = {8, 8, 8, 8, 8, 8, 8, 8}; // door 09
const u8 DoorAnimPalettes_849702C[] = {10, 10, 9, 9, 9, 9, 9, 9}; // door 10
const u8 DoorAnimPalettes_8497034[] = {9, 9, 1, 1, 1, 1, 1, 1}; // door 11
const u8 DoorAnimPalettes_849703C[] = {8, 8, 8, 8, 8, 8, 8, 8}; // door 12
const u8 DoorAnimPalettes_8497044[] = {9, 9, 9, 9, 9, 9, 9, 9}; // door 13
const u8 DoorAnimPalettes_849704C[] = {6, 6, 6, 6, 6, 6, 6, 6}; // door 14
const u8 DoorAnimPalettes_8497054[] = {6, 6, 6, 6, 6, 6, 6, 6}; // door 15
const u8 DoorAnimPalettes_849705C[] = {0, 0, 5, 5, 5, 5, 5, 5}; // door 16
const u8 DoorAnimPalettes_8497064[] = {6, 6, 1, 1, 1, 1, 1, 1}; // door 17
const u8 DoorAnimPalettes_849706C[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 18
const u8 DoorAnimPalettes_8497074[] = {6, 6, 5, 5, 5, 5, 5, 5}; // door 19
const u8 DoorAnimPalettes_849707C[] = {5, 5, 5, 5, 5, 5, 5, 5}; // door 20
const u8 DoorAnimPalettes_8497084[] = {1, 1, 1, 1, 1, 1, 1, 1}; // door 21
const u8 DoorAnimPalettes_849708C[] = {6, 6, 6, 6, 6, 6, 6, 6}; // door 22
const u8 DoorAnimPalettes_8497094[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 23
const u8 DoorAnimPalettes_849709C[] = {5, 5, 5, 5, 5, 5, 5, 5}; // door 24
const u8 DoorAnimPalettes_84970A4[] = {9, 9, 9, 9, 9, 9, 9, 9}; // door 25
const u8 DoorAnimPalettes_84970AC[] = {8, 8, 8, 8, 8, 8, 8, 8}; // door 26
const u8 DoorAnimPalettes_84970B4[] = {6, 6, 6, 6, 6, 6, 6, 6}; // door 27
const u8 DoorAnimPalettes_84970BC[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 28
const u8 DoorAnimPalettes_84970C4[] = {11, 11, 7, 7, 7, 7, 7, 7}; // door 29
const u8 DoorAnimPalettes_84970CC[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 30
const u8 DoorAnimPalettes_84970D4[] = {6, 6, 7, 7, 7, 7, 7, 7}; // door 31
const u8 DoorAnimPalettes_84970DC[] = {9, 9, 9, 9, 9, 9, 9, 9}; // door 32
const u8 DoorAnimPalettes_84970E4[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 33
const u8 DoorAnimPalettes_84970EC[] = {9, 9, 9, 9, 9, 9, 9, 9}; // door 34
const u8 DoorAnimPalettes_84970F4[] = {1, 1, 1, 1, 1, 1, 1, 1}; // door 35
const u8 DoorAnimPalettes_84970FC[] = {9, 9, 9, 9, 9, 9, 9, 9}; // door 36
const u8 DoorAnimPalettes_8497104[] = {0, 0, 0, 0, 0, 0, 0, 0}; // door 37
const u8 DoorAnimPalettes_849710C[] = {5, 5, 5, 5, 5, 5, 5, 5}; // door 38
const u8 DoorAnimPalettes_8497114[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 39
const u8 DoorAnimPalettes_849711C[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 40
const u8 DoorAnimPalettes_8497124[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 41
const u8 DoorAnimPalettes_849712C[] = {1, 1, 1, 1, 1, 1, 1, 1}; // doors 42, 43, and 44
const u8 DoorAnimPalettes_8497134[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 45
const u8 DoorAnimPalettes_849713C[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 46
const u8 DoorAnimPalettes_8497144[] = {1, 1, 1, 1, 1, 1, 1, 1}; // unused
const u8 DoorAnimPalettes_849714C[] = {1, 1, 1, 1, 1, 1, 1, 1}; // doors 47 and 48
const u8 DoorAnimPalettes_8497154[] = {9, 9, 7, 7, 7, 7, 7, 7}; // door 49
const u8 DoorAnimPalettes_849715C[] = {9, 9, 9, 9, 9, 9, 9, 9}; // door 50
const u8 DoorAnimPalettes_8497164[] = {7, 7, 7, 7, 7, 7, 7, 7}; // door 51
const u8 DoorAnimPalettes_849716C[] = {9, 9, 7, 7, 7, 7, 7, 7}; // door 52
static const struct DoorGraphics gDoorAnimGraphicsTable[] =
{
{0x021, 0, 1, DoorAnimTiles_00, DoorAnimPalettes_8496FDC}, // door 00
{0x061, 1, 1, DoorAnimTiles_01, DoorAnimPalettes_8496FE4}, // door 01
{0x1CD, 1, 1, DoorAnimTiles_02, DoorAnimPalettes_8496FEC}, // door 02
{0x041, 1, 1, DoorAnimTiles_03, DoorAnimPalettes_8496FF4}, // door 03
{0x248, 0, 1, DoorAnimTiles_04, DoorAnimPalettes_8496FFC}, // door 04
{0x249, 0, 1, DoorAnimTiles_05, DoorAnimPalettes_8497004}, // door 05
{0x22F, 0, 1, DoorAnimTiles_06, DoorAnimPalettes_849700C}, // door 06
{0x21F, 0, 1, DoorAnimTiles_07, DoorAnimPalettes_8497014}, // door 07
{0x2A5, 0, 1, DoorAnimTiles_08, DoorAnimPalettes_849701C}, // door 08
{0x287, 0, 1, DoorAnimTiles_09, DoorAnimPalettes_849702C}, // door 09
{0x2AC, 0, 1, DoorAnimTiles_10, DoorAnimPalettes_849706C}, // door 10
{0x3A1, 0, 1, DoorAnimTiles_11, DoorAnimPalettes_8497074}, // door 11
{0x2DC, 0, 1, DoorAnimTiles_12, DoorAnimPalettes_8497064}, // door 12
{0x225, 0, 1, DoorAnimTiles_13, DoorAnimPalettes_849705C}, // door 13
{0x1DB, 1, 1, DoorAnimTiles_14, DoorAnimPalettes_8497084}, // door 14
{0x246, 0, 1, DoorAnimTiles_15, DoorAnimPalettes_8497024}, // door 15
{0x28E, 0, 1, DoorAnimTiles_16, DoorAnimPalettes_849707C}, // door 16
{0x2A1, 0, 1, DoorAnimTiles_17, DoorAnimPalettes_8497034}, // door 17
{0x21C, 0, 1, DoorAnimTiles_18, DoorAnimPalettes_849704C}, // door 18
{0x21E, 0, 1, DoorAnimTiles_19, DoorAnimPalettes_8497054}, // door 19
{0x21D, 1, 1, DoorAnimTiles_20, DoorAnimPalettes_849703C}, // door 20
{0x21A, 0, 1, DoorAnimTiles_21, DoorAnimPalettes_8497044}, // door 21
{0x224, 0, 1, DoorAnimTiles_22, DoorAnimPalettes_849708C}, // door 22
{0x289, 0, 1, DoorAnimTiles_23, DoorAnimPalettes_8497094}, // door 23
{0x30C, 1, 1, DoorAnimTiles_24, DoorAnimPalettes_849709C}, // door 24
{0x32D, 1, 1, DoorAnimTiles_25, DoorAnimPalettes_84970A4}, // door 25
{0x2ED, 1, 1, DoorAnimTiles_26, DoorAnimPalettes_84970AC}, // door 26
{0x264, 1, 1, DoorAnimTiles_27, DoorAnimPalettes_84970B4}, // door 27
{0x22B, 0, 1, DoorAnimTiles_28, DoorAnimPalettes_84970BC}, // door 28
{0x2F7, 0, 1, DoorAnimTiles_29, DoorAnimPalettes_84970C4}, // door 29
{0x297, 0, 1, DoorAnimTiles_30, DoorAnimPalettes_84970CC}, // door 30
{0x285, 1, 1, DoorAnimTiles_31, DoorAnimPalettes_84970D4}, // door 31
{0x25D, 1, 1, DoorAnimTiles_32, DoorAnimPalettes_84970DC}, // door 32
{0x20E, 1, 1, DoorAnimTiles_33, DoorAnimPalettes_84970E4}, // door 33
{0x3B0, 1, 1, DoorAnimTiles_34, DoorAnimPalettes_84970EC}, // door 34
{0x28A, 1, 1, DoorAnimTiles_35, DoorAnimPalettes_84970F4}, // door 35
{0x263, 1, 1, DoorAnimTiles_36, DoorAnimPalettes_84970FC}, // door 36
{0x329, 1, 1, DoorAnimTiles_37, DoorAnimPalettes_8497104}, // door 37
{0x291, 0, 1, DoorAnimTiles_38, DoorAnimPalettes_849710C}, // door 38
{0x21B, 2, 1, DoorAnimTiles_39, DoorAnimPalettes_8497114}, // door 39
{0x209, 1, 1, DoorAnimTiles_40, DoorAnimPalettes_849711C}, // door 40
{0x219, 0, 1, DoorAnimTiles_41, DoorAnimPalettes_8497124}, // door 41
{0x393, 1, 1, DoorAnimTiles_42, DoorAnimPalettes_849712C}, // door 42
{0x3D4, 1, 1, DoorAnimTiles_42, DoorAnimPalettes_849712C}, // door 43
{0x36C, 1, 1, DoorAnimTiles_42, DoorAnimPalettes_849712C}, // door 44
{0x25E, 1, 1, DoorAnimTiles_43, DoorAnimPalettes_8497134}, // door 45
{0x2AD, 1, 2, DoorAnimTiles_44, DoorAnimPalettes_849713C}, // door 46
{0x3FC, 0, 1, DoorAnimTiles_45, DoorAnimPalettes_849714C}, // door 47
{0x396, 1, 1, DoorAnimTiles_46, DoorAnimPalettes_849714C}, // door 48
{0x20A, 1, 1, DoorAnimTiles_47, DoorAnimPalettes_8497154}, // door 49
{0x26B, 1, 1, DoorAnimTiles_48, DoorAnimPalettes_849715C}, // door 50
{0x32C, 1, 1, DoorAnimTiles_49, DoorAnimPalettes_8497164}, // door 51
{0x383, 1, 1, DoorAnimTiles_50, DoorAnimPalettes_849716C}, // door 52
{0, 0, 0, NULL, NULL},
};
static void CopyDoorTilesToVram(const struct DoorGraphics *gfx, const struct DoorAnimFrame *frame)
{
if (gfx->size == 2)
CpuFastSet(gfx->tiles + frame->offset, (void *)(VRAM + 0x7E00), 0x80);
else
CpuFastSet(gfx->tiles + frame->offset, (void *)(VRAM + 0x7F00), 0x40);
}
static void door_build_blockdef(u16 *a, u16 b, const u8 *c)
{
int i;
u16 unk;
for (i = 0; i < 4; i++)
{
unk = *(c++) << 12;
a[i] = unk | (b + i);
}
for (; i < 8; i++)
{
unk = *(c++) << 12;
a[i] = unk;
}
}
static void DrawCurrentDoorAnimFrame(const struct DoorGraphics *gfx, u32 x, u32 y, const u8 *pal)
{
u16 arr[24];
if (gfx->size == 2)
{
door_build_blockdef(&arr[8], 0x3F0, pal);
DrawDoorMetatileAt(x, y - 1, &arr[8]);
door_build_blockdef(&arr[8], 0x3F4, pal + 4);
DrawDoorMetatileAt(x, y, &arr[8]);
door_build_blockdef(&arr[8], 0x3F8, pal);
DrawDoorMetatileAt(x + 1, y - 1, &arr[8]);
door_build_blockdef(&arr[8], 0x3FC, pal + 4);
DrawDoorMetatileAt(x + 1, y, &arr[8]);
}
else
{
door_build_blockdef(&arr[0], 0x3F8, pal);
DrawDoorMetatileAt(x, y - 1, &arr[0]);
door_build_blockdef(&arr[0], 0x3FC, pal + 4);
DrawDoorMetatileAt(x, y, &arr[0]);
}
}
static void DrawClosedDoorTiles(const struct DoorGraphics *gfx, u32 x, u32 y)
{
CurrentMapDrawMetatileAt(x, y - 1);
CurrentMapDrawMetatileAt(x, y);
if (gfx->size == 2)
{
CurrentMapDrawMetatileAt(x + 1, y - 1);
CurrentMapDrawMetatileAt(x + 1, y);
}
}
static void DrawDoor(const struct DoorGraphics *gfx, const struct DoorAnimFrame *frame, u32 x, u32 y)
{
if (frame->offset == 0xFFFF)
{
DrawClosedDoorTiles(gfx, x, y);
if (sub_808A964())
DrawClosedDoorTiles(gfx, gSpecialVar_0x8004 + 7, gSpecialVar_0x8005 + 7);
}
else
{
CopyDoorTilesToVram(gfx, frame);
DrawCurrentDoorAnimFrame(gfx, x, y, gfx->palette);
if (sub_808A964())
DrawCurrentDoorAnimFrame(gfx, gSpecialVar_0x8004 + 7, gSpecialVar_0x8005 + 7, gfx->palette);
}
}
enum
{
TD_FRAMELIST = 0,
TD_GFX = 2,
TD_FRAME = 4,
TD_COUNTER,
TD_X,
TD_Y
};
static bool32 sub_808A5F0(struct DoorGraphics *gfx, struct DoorAnimFrame *frames, s16 *taskData)
{
if (taskData[TD_COUNTER] == 0)
DrawDoor(gfx, &frames[taskData[TD_FRAME]], taskData[TD_X], taskData[TD_Y]);
if (taskData[TD_COUNTER] == frames[taskData[TD_FRAME]].time)
{
taskData[TD_COUNTER] = 0;
taskData[TD_FRAME]++;
if (frames[taskData[TD_FRAME]].time == 0)
return FALSE;
else
return TRUE;
}
taskData[TD_COUNTER]++;
return TRUE;
}
static void Task_AnimateDoor(u8 taskId)
{
u16 *taskData = gTasks[taskId].data;
struct DoorAnimFrame *frames = (struct DoorAnimFrame *)(taskData[TD_FRAMELIST] << 16 | taskData[TD_FRAMELIST + 1]);
struct DoorGraphics *gfx = (struct DoorGraphics *)(taskData[TD_GFX] << 16 | taskData[TD_GFX + 1]);
if (sub_808A5F0(gfx, frames, taskData) == FALSE)
DestroyTask(taskId);
}
static const struct DoorAnimFrame *GetLastDoorFrame(const struct DoorAnimFrame *frame, const void *unused)
{
while (frame->time != 0)
frame++;
return frame - 1;
}
static const struct DoorGraphics *GetDoorGraphics(const struct DoorGraphics *gfx, u16 metatileNum)
{
while (gfx->tiles != NULL)
{
if (gfx->metatileNum == metatileNum)
return gfx;
gfx++;
}
return NULL;
}
static s8 StartDoorAnimationTask(const struct DoorGraphics *gfx, const struct DoorAnimFrame *frames, u32 x, u32 y)
{
if (FuncIsActiveTask(Task_AnimateDoor) == TRUE)
return -1;
else
{
u8 taskId = CreateTask(Task_AnimateDoor, 0x50);
s16 *taskData = gTasks[taskId].data;
taskData[TD_X] = x;
taskData[TD_Y] = y;
taskData[TD_FRAMELIST + 1] = (u32)frames;
taskData[TD_FRAMELIST] = (u32)frames >> 16;
taskData[TD_GFX + 1] = (u32)gfx;
taskData[TD_GFX] = (u32)gfx >> 16;
return taskId;
}
}
static void DrawClosedDoor(const struct DoorGraphics *gfx, u32 x, u32 y)
{
DrawClosedDoorTiles(gfx, x, y);
}
static void DrawOpenedDoor(const struct DoorGraphics *gfx, u32 x, u32 y)
{
gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y));
if (gfx != NULL)
DrawDoor(gfx, GetLastDoorFrame(gDoorOpenAnimFrames, gDoorOpenAnimFrames), x, y);
}
static s8 StartDoorOpenAnimation(const struct DoorGraphics *gfx, u32 x, u32 y)
{
gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y));
if (gfx == NULL)
{
return -1;
}
else
{
if (gfx->size == 2)
return StartDoorAnimationTask(gfx, gBigDoorOpenAnimFrames, x, y);
else
return StartDoorAnimationTask(gfx, gDoorOpenAnimFrames, x, y);
}
}
static s8 StartDoorCloseAnimation(const struct DoorGraphics *gfx, u32 x, u32 y)
{
gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y));
if (gfx == NULL)
return -1;
else
return StartDoorAnimationTask(gfx, gDoorCloseAnimFrames, x, y);
}
static s8 cur_mapdata_get_door_x2_at(const struct DoorGraphics *gfx, u32 x, u32 y)
{
gfx = GetDoorGraphics(gfx, MapGridGetMetatileIdAt(x, y));
if (gfx == NULL)
return -1;
else
return gfx->sound;
}
void unref_sub_808A83C(u32 x, u32 y)
{
StartDoorOpenAnimation(gDoorAnimGraphicsTable, x, y);
}
void FieldSetDoorOpened(u32 x, u32 y)
{
if (MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y)))
DrawOpenedDoor(gDoorAnimGraphicsTable, x, y);
}
void FieldSetDoorClosed(u32 x, u32 y)
{
if (MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y)))
DrawClosedDoor(gDoorAnimGraphicsTable, x, y);
}
s8 FieldAnimateDoorClose(u32 x, u32 y)
{
if (!MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y)))
return -1;
else
return StartDoorCloseAnimation(gDoorAnimGraphicsTable, x, y);
}
s8 FieldAnimateDoorOpen(u32 x, u32 y)
{
if (!MetatileBehavior_IsDoor(MapGridGetMetatileBehaviorAt(x, y)))
return -1;
else
return StartDoorOpenAnimation(gDoorAnimGraphicsTable, x, y);
}
bool8 FieldIsDoorAnimationRunning(void)
{
return FuncIsActiveTask(Task_AnimateDoor);
}
u32 GetDoorSoundEffect(u32 x, u32 y)
{
int sound = cur_mapdata_get_door_x2_at(gDoorAnimGraphicsTable, x, y);
if (sound == 0)
return SE_DOOR;
else if (sound == 1)
return SE_JIDO_DOA;
else if (sound == 2)
return SE_TU_SAA;
else
return SE_DOOR;
}
bool8 sub_808A964(void)
{
if (FlagGet(FLAG_SPECIAL_FLAG_0x4002))
{
if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_FRONTIER_BATTLE_TOWER_CORRIDOR_2) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_TOWER_CORRIDOR_2))
{
return TRUE;
}
}
return FALSE;
}
Executable → Regular
+249 -249
View File
File diff suppressed because it is too large Load Diff
+844
View File
@@ -0,0 +1,844 @@
#include "global.h"
#include "field_ground_effect.h"
#include "field_map_obj.h"
#include "field_effect.h"
#include "field_map_obj_helpers.h"
#include "malloc.h"
#include "task.h"
#include "util.h"
typedef void (*SpriteStepFunc)(struct Sprite *sprite, u8 dir);
extern const struct Coords16 gUnknown_0850DB7C[4];
extern s16 gUnknown_0850E768[];
extern SpriteStepFunc *const gUnknown_0850E754[];
extern const s8 gUnknown_0850E772[];
extern const s8 gUnknown_0850E7BA[];
extern const s8 *const gUnknown_0850E834[];
extern s16 gUnknown_0850E840[];
extern u8 gUnknown_0850E846[];
extern s16 gUnknown_0850E84A[];
extern u8 gUnknown_0850E850[];
void sub_8097D68(struct Sprite *sprite);
void sub_8097FE4(u8);
bool8 FreezeMapObject(struct MapObject *mapObject)
{
if (mapObject->mapobj_bit_6 || mapObject->mapobj_bit_8)
{
return TRUE;
}
else
{
mapObject->mapobj_bit_8 = 1;
mapObject->mapobj_bit_23 = gSprites[mapObject->spriteId].animPaused;
mapObject->mapobj_bit_24 = gSprites[mapObject->spriteId].affineAnimPaused;
gSprites[mapObject->spriteId].animPaused = 1;
gSprites[mapObject->spriteId].affineAnimPaused = 1;
return FALSE;
}
}
void FreezeMapObjects(void)
{
u8 i;
for (i = 0; i < MAP_OBJECTS_COUNT; i++)
if (gMapObjects[i].active && i != gPlayerAvatar.mapObjectId)
FreezeMapObject(&gMapObjects[i]);
}
void FreezeMapObjectsExceptOne(u8 a1)
{
u8 i;
for (i = 0; i < MAP_OBJECTS_COUNT; i++)
if (i != a1 && gMapObjects[i].active && i != gPlayerAvatar.mapObjectId)
FreezeMapObject(&gMapObjects[i]);
}
void npc_sync_anim_pause_bits(struct MapObject *mapObject)
{
if (mapObject->active && mapObject->mapobj_bit_8)
{
mapObject->mapobj_bit_8 = 0;
gSprites[mapObject->spriteId].animPaused = mapObject->mapobj_bit_23;
gSprites[mapObject->spriteId].affineAnimPaused = mapObject->mapobj_bit_24;
}
}
void UnfreezeMapObjects(void)
{
u8 i;
for (i = 0; i < MAP_OBJECTS_COUNT; i++)
if (gMapObjects[i].active)
npc_sync_anim_pause_bits(&gMapObjects[i]);
}
void little_step(struct Sprite *sprite, u8 dir)
{
sprite->pos1.x += gUnknown_0850DB7C[dir].x;
sprite->pos1.y += gUnknown_0850DB7C[dir].y;
}
void double_little_steps(struct Sprite *sprite, u8 dir)
{
sprite->pos1.x += 2 * (u16) gUnknown_0850DB7C[dir].x;
sprite->pos1.y += 2 * (u16) gUnknown_0850DB7C[dir].y;
}
void triple_little_steps(struct Sprite *sprite, u8 dir)
{
sprite->pos1.x += 2 * (u16) gUnknown_0850DB7C[dir].x + (u16) gUnknown_0850DB7C[dir].x;
sprite->pos1.y += 2 * (u16) gUnknown_0850DB7C[dir].y + (u16) gUnknown_0850DB7C[dir].y;
}
void quad_little_steps(struct Sprite *sprite, u8 dir)
{
sprite->pos1.x += 4 * (u16) gUnknown_0850DB7C[dir].x;
sprite->pos1.y += 4 * (u16) gUnknown_0850DB7C[dir].y;
}
void oct_little_steps(struct Sprite *sprite, u8 dir)
{
sprite->pos1.x += 8 * (u16) gUnknown_0850DB7C[dir].x;
sprite->pos1.y += 8 * (u16) gUnknown_0850DB7C[dir].y;
}
void oamt_npc_ministep_reset(struct Sprite *sprite, u8 a2, u8 a3)
{
sprite->data[3] = a2;
sprite->data[4] = a3;
sprite->data[5] = 0;
}
bool8 obj_npc_ministep(struct Sprite *sprite)
{
if (sprite->data[5] >= gUnknown_0850E768[sprite->data[4]])
return FALSE;
gUnknown_0850E754[sprite->data[4]][sprite->data[5]](sprite, sprite->data[3]);
sprite->data[5]++;
if (sprite->data[5] < gUnknown_0850E768[sprite->data[4]])
return FALSE;
return TRUE;
}
void sub_80976DC(struct Sprite *sprite, u8 a2)
{
sprite->data[3] = a2;
sprite->data[4] = 0;
sprite->data[5] = 0;
}
bool8 sub_80976EC(struct Sprite *sprite)
{
if (!(sprite->data[4] & 1))
{
little_step(sprite, sprite->data[3]);
sprite->data[5]++;
}
sprite->data[4]++;
if (sprite->data[5] > 15)
return TRUE;
else
return FALSE;
}
// new helper added here in the middle. Perhaps Game Freak kept these organized in alphebetical order or some other heirarchy?
s16 sub_8097728(s16 a1)
{
return gUnknown_0850E7BA[a1];
}
s16 sub_809773C(s16 a1)
{
return gUnknown_0850E772[a1];
}
void sub_8097750(struct Sprite *sprite)
{
sprite->data[6] = 0;
sprite->data[7] = 0;
}
bool8 sub_8097758(struct Sprite *sprite)
{
bool8 result = FALSE;
switch(sprite->data[7])
{
case 0:
sprite->pos2.x += sub_809773C(sprite->data[6]);
sprite->pos2.y += sub_8097728(sprite->data[6]);
break;
case 1:
sprite->pos2.x -= sub_809773C(0x47 - sprite->data[6]);
sprite->pos2.y += sub_8097728(0x47 - sprite->data[6]);
break;
case 2:
sprite->pos2.x -= sub_809773C(sprite->data[6]);
sprite->pos2.y += sub_8097728(sprite->data[6]);
break;
case 3:
sprite->pos2.x += sub_809773C(0x47 - sprite->data[6]);
sprite->pos2.y += sub_8097728(0x47 - sprite->data[6]);
break;
}
if(++sprite->data[6] == 0x48)
{
sprite->data[6] = 0;
sprite->data[7]++;
}
if(sprite->data[7] == 0x4)
{
sprite->pos2.y = 0;
sprite->pos2.x = 0;
result = TRUE;
}
return result;
}
s16 sub_8097820(s16 a1, u8 a2)
{
return gUnknown_0850E834[a2][a1];
}
void sub_809783C(struct Sprite *sprite, u8 a2, u8 a3, u8 a4)
{
sprite->data[3] = a2;
sprite->data[4] = a3;
sprite->data[5] = a4;
sprite->data[6] = 0;
}
u8 sub_809785C(struct Sprite *sprite)
{
s16 v5[3];
u8 v6[3];
u8 v2;
memcpy(v5, gUnknown_0850E840, 6); // TODO: get rid of memcpy
memcpy(v6, gUnknown_0850E846, 3);
v2 = 0;
if (sprite->data[4])
little_step(sprite, sprite->data[3]);
sprite->pos2.y = sub_8097820(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]);
sprite->data[6]++;
if (sprite->data[6] == (v5[sprite->data[4]] >> 1))
v2 = 1;
if (sprite->data[6] >= v5[sprite->data[4]])
{
sprite->pos2.y = 0;
v2 = -1;
}
return v2;
}
u8 sub_80978E4(struct Sprite *sprite)
{
s16 v5[3];
u8 v6[3];
u8 v2;
memcpy(v5, gUnknown_0850E84A, 6);
memcpy(v6, gUnknown_0850E850, 3);
v2 = 0;
if (sprite->data[4] && !(sprite->data[6] & 1))
little_step(sprite, sprite->data[3]);
sprite->pos2.y = sub_8097820(sprite->data[6] >> v6[sprite->data[4]], sprite->data[5]);
sprite->data[6]++;
if (sprite->data[6] == (v5[sprite->data[4]] >> 1))
v2 = 1;
if (sprite->data[6] >= v5[sprite->data[4]])
{
sprite->pos2.y = 0;
v2 = -1;
}
return v2;
}
void SetFieldObjectStepTimer(struct Sprite *sprite, u16 timer)
{
sprite->data[3] = timer;
}
bool8 RunFieldObjectStepTimer(struct Sprite *sprite)
{
sprite->data[3]--;
if (sprite->data[3] == 0)
return TRUE;
else
return FALSE;
}
void obj_anim_image_set_and_seek(struct Sprite *sprite, u8 a2, u8 a3)
{
sprite->animNum = a2;
sprite->animPaused = 0 ;
SeekSpriteAnim(sprite, a3);
}
bool8 sub_80979BC(struct Sprite *sprite)
{
if (sprite->animEnded)
return TRUE;
else
return FALSE;
}
void sub_80979D4(struct Sprite *sprite, bool8 invisible)
{
u16 x, y;
s16 x2, y2;
sprite->invisible = invisible;
if (sprite->coordOffsetEnabled)
{
x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX + gSpriteCoordOffsetX;
y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY;
}
else
{
x = sprite->pos1.x + sprite->pos2.x + sprite->centerToCornerVecX;
y = sprite->pos1.y + sprite->pos2.y + sprite->centerToCornerVecY;
}
x2 = x - (sprite->centerToCornerVecX >> 1);
y2 = y - (sprite->centerToCornerVecY >> 1);
if ((s16)x > 255 || x2 < -16)
sprite->invisible = 1;
if ((s16)y > 175 || y2 < -16)
sprite->invisible = 1;
}
void sub_8097AC8(struct Sprite *sprite)
{
sub_8097D68(sprite);
SetObjectSubpriorityByZCoord(sprite->data[1], sprite, 1);
sub_80979D4(sprite, sprite->data[2]);
}
void sub_8097AF0(void)
{
int i;
for(i = 0; i < MAX_SPRITES; i++)
{
struct Sprite *sprite = &gSprites[i];
if(sprite->inUse && sprite->callback == sub_8097AC8)
DestroySprite(sprite);
}
}
int sub_8097B2C(u8 var) // this should return a u8, because all that call this shifts to u8, but it wont match because it doesnt shift u8 at the end.
{
int i;
for(i = 0; i < MAX_SPRITES; i++)
{
struct Sprite *sprite = &gSprites[i];
if(sprite->inUse && sprite->callback == sub_8097AC8 && (u8)sprite->data[0] == var)
return i;
}
return MAX_SPRITES;
}
void sub_8097B78(u8 var1, u8 var2)
{
u8 spriteId = sub_8097B2C(var1);
if(spriteId != MAX_SPRITES)
StartSpriteAnim(&gSprites[spriteId], FieldObjectDirectionToImageAnimId(var2));
}
void sub_8097BB4(u8 var1, u8 var2)
{
int spriteId = sub_8097B2C(var1);
if(spriteId != MAX_SPRITES)
{
struct Sprite *sprite = &gSprites[spriteId];
const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(var2);
u16 tileNum = sprite->oam.tileNum;
sprite->oam = *gfxInfo->oam;
sprite->oam.tileNum = tileNum;
sprite->oam.paletteNum = gfxInfo->paletteSlot;
sprite->images = gfxInfo->images;
if(gfxInfo->subspriteTables == NULL)
{
sprite->subspriteTables = NULL;
sprite->subspriteTableNum = 0;
sprite->subspriteMode = 0;
}
else
{
SetSubspriteTables(sprite, gfxInfo->subspriteTables);
sprite->subspriteMode = 2;
}
StartSpriteAnim(sprite, 0);
}
}
void sub_8097C44(u8 var, bool32 var2)
{
u8 spriteId = sub_8097B2C(var);
if(spriteId == MAX_SPRITES)
return;
if(var2)
gSprites[spriteId].data[2] = 1;
else
gSprites[spriteId].data[2] = 0;
}
bool32 sub_8097C8C(u8 var)
{
u8 spriteId = sub_8097B2C(var);
if(spriteId == MAX_SPRITES)
return FALSE;
return (gSprites[spriteId].data[2] == TRUE);
}
void sub_8097CC4(u8 var1, u8 var2)
{
u8 spriteId = sub_8097B2C(var1);
if(spriteId != MAX_SPRITES)
{
gSprites[spriteId].data[3] = var2;
gSprites[spriteId].data[4] = 0;
}
}
void sub_8097CF4(struct Sprite *sprite)
{
switch(sprite->data[4])
{
case 0:
sprite->pos2.y = 0;
sprite->data[4]++;
case 1:
sprite->pos2.y -= 8;
if(sprite->pos2.y == -160)
{
sprite->pos2.y = 0;
sprite->data[2] = 1;
sprite->data[3] = 0;
sprite->data[4] = 0;
}
}
}
void sub_8097D30(struct Sprite *sprite)
{
switch(sprite->data[4])
{
case 0:
sprite->pos2.y = -160;
sprite->data[4]++;
case 1:
sprite->pos2.y += 8;
if(sprite->pos2.y == 0)
{
sprite->data[3] = 0;
sprite->data[4] = 0;
}
}
}
void sub_8097D68(struct Sprite *sprite)
{
switch(sprite->data[3])
{
case 1:
sub_8097D30(sprite);
break;
case 2:
sub_8097CF4(sprite);
break;
case 0:
break;
default:
sprite->data[3] = 0;
break;
}
}
bool32 sub_8097D9C(u8 var)
{
u8 spriteId = sub_8097B2C(var);
if(spriteId == MAX_SPRITES)
return FALSE;
if(gSprites[spriteId].data[3] != FALSE)
return TRUE;
return FALSE;
}
u32 oe_exec_and_other_stuff(u8 fieldEffectId, struct MapObject *mapObject)
{
FieldObjectGetLocalIdAndMap(mapObject, &gFieldEffectArguments[0], &gFieldEffectArguments[1], &gFieldEffectArguments[2]);
return FieldEffectStart(fieldEffectId);
}
void DoShadowFieldEffect(struct MapObject *mapObject)
{
if (!mapObject->mapobj_bit_22)
{
mapObject->mapobj_bit_22 = 1;
oe_exec_and_other_stuff(FLDEFF_SHADOW, mapObject);
}
}
void DoRippleFieldEffect(struct MapObject *mapObject, struct Sprite *sprite)
{
const struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId);
gFieldEffectArguments[0] = sprite->pos1.x;
gFieldEffectArguments[1] = sprite->pos1.y + (gfxInfo->height >> 1) - 2;
gFieldEffectArguments[2] = 151;
gFieldEffectArguments[3] = 3;
FieldEffectStart(FLDEFF_RIPPLE);
}
#ifdef NONMATCHING
bool32 sub_8097E50(struct MapObject *mapObject, struct Sprite *sprite)
{
bool32 ableToStore = FALSE;
if (gUnknown_020375B8 == NULL)
{
gUnknown_020375B8 = AllocZeroed(0x14);
gUnknown_020375B8[0] = mapObject->localId;
gUnknown_020375B8[16] = 1;
ableToStore = TRUE;
}
else
{
u8 i;
u8 firstFreeSlot;
bool32 found;
for (firstFreeSlot = 16, found = FALSE, i = 0; i < 16; i++)
{
if (firstFreeSlot == 16 && gUnknown_020375B8[i] == 0)
firstFreeSlot = i;
if (gUnknown_020375B8[i] == mapObject->localId)
{
found = TRUE;
break;
}
}
if (!found && firstFreeSlot != 16)
{
gUnknown_020375B8[firstFreeSlot] = mapObject->localId;
gUnknown_020375B8[16]++;
ableToStore = TRUE; // the nonmatching problem is that ableToStore == TRUE isnt being merged with the above ableToStore = TRUE assignment.
}
}
if (ableToStore == TRUE)
{
mapObject->mapobj_bit_12 = TRUE;
mapObject->mapobj_bit_9 = TRUE;
}
sprite->data[2] = 1;
return TRUE;
}
#else
__attribute__((naked))
bool32 sub_8097E50(struct MapObject *mapObject, struct Sprite *sprite)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
mov r7, r8\n\
push {r7}\n\
adds r4, r0, 0\n\
mov r8, r1\n\
movs r0, 0\n\
mov r12, r0\n\
ldr r0, =gUnknown_020375B8\n\
ldr r1, [r0]\n\
adds r6, r0, 0\n\
cmp r1, 0\n\
bne _08097E80\n\
movs r0, 0x14\n\
bl AllocZeroed\n\
str r0, [r6]\n\
ldrb r1, [r4, 0x8]\n\
strb r1, [r0]\n\
ldr r1, [r6]\n\
movs r0, 0x1\n\
strb r0, [r1, 0x10]\n\
b _08097ECC\n\
.pool\n\
_08097E80:\n\
movs r2, 0x10\n\
movs r5, 0\n\
movs r1, 0\n\
adds r3, r6, 0\n\
b _08097E90\n\
_08097E8A:\n\
adds r0, r1, 0x1\n\
lsls r0, 24\n\
lsrs r1, r0, 24\n\
_08097E90:\n\
cmp r1, 0xF\n\
bhi _08097EB2\n\
cmp r2, 0x10\n\
bne _08097EA4\n\
ldr r0, [r3]\n\
adds r0, r1\n\
ldrb r0, [r0]\n\
cmp r0, 0\n\
bne _08097EA4\n\
adds r2, r1, 0\n\
_08097EA4:\n\
ldr r0, [r3]\n\
adds r0, r1\n\
ldrb r0, [r0]\n\
ldrb r7, [r4, 0x8]\n\
cmp r0, r7\n\
bne _08097E8A\n\
movs r5, 0x1\n\
_08097EB2:\n\
cmp r5, 0\n\
bne _08097ECE\n\
cmp r2, 0x10\n\
beq _08097ECE\n\
ldr r0, [r6]\n\
adds r0, r2\n\
ldrb r1, [r4, 0x8]\n\
strb r1, [r0]\n\
ldr r1, [r6]\n\
ldrb r0, [r1, 0x10]\n\
adds r0, 0x1\n\
strb r0, [r1, 0x10]\n\
movs r0, 0x1\n\
_08097ECC:\n\
mov r12, r0\n\
_08097ECE:\n\
mov r1, r12\n\
cmp r1, 0x1\n\
bne _08097EE0\n\
ldrb r0, [r4, 0x1]\n\
movs r1, 0x10\n\
orrs r0, r1\n\
movs r1, 0x2\n\
orrs r0, r1\n\
strb r0, [r4, 0x1]\n\
_08097EE0:\n\
movs r0, 0x1\n\
mov r7, r8\n\
strh r0, [r7, 0x32]\n\
pop {r3}\n\
mov r8, r3\n\
pop {r4-r7}\n\
pop {r1}\n\
bx r1\n\
.syntax divided");
}
#endif
// this function is very similar to the above one and I don't want to decompile this one until the above is matching.
__attribute__((naked))
bool32 sub_8097EF0(struct MapObject *mapObject, struct Sprite *sprite)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
mov r7, r8\n\
push {r7}\n\
adds r6, r0, 0\n\
mov r8, r1\n\
movs r0, 0x1\n\
strh r0, [r1, 0x32]\n\
ldr r5, =gUnknown_020375B8\n\
ldr r0, [r5]\n\
cmp r0, 0\n\
beq _08097F68\n\
movs r7, 0\n\
adds r0, r6, 0\n\
bl sub_8097F78\n\
lsls r0, 24\n\
lsrs r1, r0, 24\n\
cmp r1, 0x10\n\
beq _08097F28\n\
ldr r0, [r5]\n\
adds r0, r1\n\
movs r1, 0\n\
strb r1, [r0]\n\
ldr r1, [r5]\n\
ldrb r0, [r1, 0x10]\n\
subs r0, 0x1\n\
strb r0, [r1, 0x10]\n\
movs r7, 0x1\n\
_08097F28:\n\
ldr r0, [r5]\n\
ldrb r4, [r0, 0x10]\n\
cmp r4, 0\n\
bne _08097F36\n\
bl Free\n\
str r4, [r5]\n\
_08097F36:\n\
cmp r7, 0x1\n\
bne _08097F68\n\
ldrb r0, [r6, 0x5]\n\
bl GetFieldObjectGraphicsInfo\n\
ldrb r1, [r0, 0xC]\n\
lsls r1, 25\n\
lsrs r1, 31\n\
lsls r1, 4\n\
ldrb r2, [r6, 0x1]\n\
movs r0, 0x11\n\
negs r0, r0\n\
ands r0, r2\n\
orrs r0, r1\n\
movs r1, 0x3\n\
negs r1, r1\n\
ands r0, r1\n\
strb r0, [r6, 0x1]\n\
mov r2, r8\n\
adds r2, 0x2C\n\
ldrb r1, [r2]\n\
movs r0, 0x41\n\
negs r0, r0\n\
ands r0, r1\n\
strb r0, [r2]\n\
_08097F68:\n\
movs r0, 0x1\n\
pop {r3}\n\
mov r8, r3\n\
pop {r4-r7}\n\
pop {r1}\n\
bx r1\n\
.pool\n\
.syntax divided");
}
u8 sub_8097F78(struct MapObject *mapObject)
{
u8 i;
for(i = 0; i < MAP_OBJECTS_COUNT; i++)
{
if(gUnknown_020375B8[i] == mapObject->localId)
return i;
}
return MAP_OBJECTS_COUNT;
}
void sub_8097FA4(struct MapObject *mapObject)
{
u8 taskId = CreateTask(sub_8097FE4, 0xFF);
struct Task *task = &gTasks[taskId];
StoreWordInTwoHalfwords(&task->data[0], (u32)mapObject);
mapObject->mapobj_unk_1B = taskId;
task->data[3] = 0xFFFF;
}
void sub_8097FE4(u8 taskId)
{
struct MapObject *mapObject;
struct Sprite *sprite;
struct Task *task = &gTasks[taskId];
LoadWordFromTwoHalfwords(&task->data[0], (u32 *)&mapObject); // load the map object pointer.
sprite = &gSprites[mapObject->spriteId];
if(!(task->data[2] & 0x3))
sprite->pos2.y += task->data[3];
if(!(task->data[2] & 0xF))
task->data[3] = -task->data[3];
task->data[2]++;
}
void sub_8098044(u8 taskId)
{
u32 word;
struct Task *task = &gTasks[taskId];
LoadWordFromTwoHalfwords(&task->data[0], &word); // huh??? why does it load a word that never gets used???
DestroyTask(taskId);
}
void sub_8098074(u8 var1, u8 var2)
{
u8 i;
for(i = 0; i < MAP_OBJECTS_COUNT; i++)
{
if(i != var1 && i != var2 &&
gMapObjects[i].active && i != gPlayerAvatar.mapObjectId)
FreezeMapObject(&gMapObjects[i]);
}
}
bool32 sub_80980C0(struct MapObject *mapObject, struct Sprite *sprite)
{
sprite->pos2.y = 0;
sprite->data[2]++;
return FALSE;
}
bool32 sub_80980D0(struct MapObject *mapObject, struct Sprite *sprite)
{
sprite->pos2.y -= 8;
if(sprite->pos2.y == -160)
sprite->data[2]++;
return FALSE;
}
bool32 sub_80980F4(struct MapObject *mapObject, struct Sprite *sprite)
{
sprite->pos2.y = -160;
sprite->data[2]++;
return FALSE;
}
bool32 sub_8098108(struct MapObject *mapObject, struct Sprite *sprite)
{
sprite->pos2.y += 8;
if(!sprite->pos2.y)
sprite->data[2]++;
return FALSE;
}
// though this function returns TRUE without doing anything, this header is required due to being in an array of functions which needs it.
bool32 sub_8098124(struct MapObject *mapObject, struct Sprite *sprite)
{
return TRUE;
}
+155
View File
@@ -0,0 +1,155 @@
#include "global.h"
#include "menu.h"
#include "string.h"
#include "string_util.h"
#include "task.h"
#include "text.h"
#include "battle_frontier_1.h"
EWRAM_DATA u8 gUnknown_020375BC = 0;
void textbox_fdecode_auto_and_task_add(u8*, int);
void textbox_auto_and_task_add(void);
void sub_8098128(void)
{
gUnknown_020375BC = 0;
gTextFlags.flag_0 = 0;
gTextFlags.flag_1 = 0;
gTextFlags.flag_2 = 0;
gTextFlags.flag_3 = 0;
}
void sub_8098154(u8 taskId)
{
struct Task *task = &gTasks[taskId];
switch (task->data[0])
{
case 0:
sub_81973A4();
task->data[0]++;
break;
case 1:
NewMenuHelpers_DrawDialogueFrame(0, 1);
task->data[0]++;
break;
case 2:
if (sub_8197224() != 1)
{
gUnknown_020375BC = 0;
DestroyTask(taskId);
}
}
}
void task_add_textbox(void)
{
CreateTask(sub_8098154, 0x50);
}
void task_del_textbox(void)
{
u8 taskId = FindTaskIdByFunc(sub_8098154);
if (taskId != 0xFF)
DestroyTask(taskId);
}
bool8 ShowFieldMessage(u8 *str)
{
if (gUnknown_020375BC != 0)
return FALSE;
textbox_fdecode_auto_and_task_add(str, 1);
gUnknown_020375BC = 2;
return TRUE;
}
void sub_8098214(u8 taskId)
{
if (sub_8196094() == 0)
{
gUnknown_020375BC = 0;
DestroyTask(taskId);
}
}
bool8 sub_8098238(u8 *str)
{
if (gUnknown_020375BC != 0)
return FALSE;
StringExpandPlaceholders(gStringVar4, str);
CreateTask(sub_8098214, 0);
sub_8196080(str);
gUnknown_020375BC = 2;
return TRUE;
}
bool8 ShowFieldAutoScrollMessage(u8 *str)
{
if (gUnknown_020375BC != 0)
return FALSE;
gUnknown_020375BC = 3;
textbox_fdecode_auto_and_task_add(str, 0);
return TRUE;
}
bool8 sub_80982A0(u8 *str)
{
gUnknown_020375BC = 3;
textbox_fdecode_auto_and_task_add(str, 1);
return TRUE;
}
bool8 sub_80982B8(void)
{
if (gUnknown_020375BC != 0)
return FALSE;
gUnknown_020375BC = 2;
textbox_auto_and_task_add();
return TRUE;
}
void textbox_fdecode_auto_and_task_add(u8* str, int a)
{
StringExpandPlaceholders(gStringVar4, str);
AddTextPrinterForMessage(a);
task_add_textbox();
}
void textbox_auto_and_task_add(void)
{
AddTextPrinterForMessage(1);
task_add_textbox();
}
void HideFieldMessageBox(void)
{
task_del_textbox();
sub_8197434(0, 1);
gUnknown_020375BC = 0;
}
u8 textbox_any_visible(void)
{
return gUnknown_020375BC;
}
bool8 IsFieldMessageBoxHidden(void)
{
if (gUnknown_020375BC == 0)
return TRUE;
return FALSE;
}
void sub_8098358(void)
{
task_del_textbox();
NewMenuHelpers_DrawStdWindowFrame(0, 1);
gUnknown_020375BC = 0;
}
void sub_8098374(void)
{
task_del_textbox();
gUnknown_020375BC = 0;
}
+148
View File
@@ -0,0 +1,148 @@
#include "global.h"
#include "string_util.h"
#include "party_menu.h"
#include "constants/species.h"
#include "task.h"
#include "field_message_box.h"
#include "strings.h"
#include "rom_818CFC8.h"
#include "battle_frontier_2.h"
#include "pokenav.h"
#include "event_data.h"
#include "script.h"
#include "battle.h"
#include "fldeff_80F9BCC.h"
#include "field_poison.h"
static bool32 sub_80F9568(struct Pokemon *pokemon)
{
u16 species = GetMonData(pokemon, MON_DATA_SPECIES2);
if (species == SPECIES_NONE || species == SPECIES_EGG)
{
return FALSE;
}
return TRUE;
}
static bool32 sub_80F958C(void)
{
int i;
struct Pokemon *pokemon;
for (pokemon = gPlayerParty, i = 0; i < PARTY_SIZE; i++, pokemon++)
{
if (sub_80F9568(pokemon) && GetMonData(pokemon, MON_DATA_HP) != 0)
{
return FALSE;
}
}
return TRUE;
}
static void sub_80F95C0(u8 partyIdx)
{
struct Pokemon *pokemon = gPlayerParty + partyIdx;
unsigned int status = STATUS1_NONE;
AdjustFriendship(pokemon, 0x07);
SetMonData(pokemon, MON_DATA_STATUS, &status);
GetMonData(pokemon, MON_DATA_NICKNAME, gStringVar1);
StringGetEnd10(gStringVar1);
}
static bool32 sub_80F960C(u8 partyIdx)
{
struct Pokemon *pokemon = gPlayerParty + partyIdx;
if (sub_80F9568(pokemon) && GetMonData(pokemon, MON_DATA_HP) == 0 && pokemon_ailments_get_primary(GetMonData(pokemon, MON_DATA_STATUS)) == AILMENT_PSN)
{
return TRUE;
}
return FALSE;
}
static void sub_80F9654(u8 taskId)
{
s16 *data = gTasks[taskId].data;
switch (data[0])
{
case 0:
for (; data[1] < PARTY_SIZE; data[1]++)
{
if (sub_80F960C(data[1]))
{
sub_80F95C0(data[1]);
ShowFieldMessage(gText_PkmnFainted3);
data[0]++;
return;
}
}
data[0] = 2;
break;
case 1:
if (IsFieldMessageBoxHidden())
{
data[0]--;
}
break;
case 2:
if (sub_80F958C())
{
if (InBattlePyramid() | InBattlePike() || sub_81D5C18())
{
gSpecialVar_Result = 2;
}
else
{
gSpecialVar_Result = 1;
}
}
else
{
gSpecialVar_Result = 0;
}
EnableBothScriptContexts();
DestroyTask(taskId);
break;
}
}
void sub_80F972C(void)
{
CreateTask(sub_80F9654, 80);
ScriptContext1_Stop();
}
unsigned int overworld_poison(void)
{
int i;
unsigned int hp;
struct Pokemon *pokemon = gPlayerParty;
unsigned int numPoisoned = 0;
unsigned int numFainted = 0;
for (i = 0; i < PARTY_SIZE; i++)
{
if (GetMonData(pokemon, MON_DATA_SANITY_BIT2) && pokemon_ailments_get_primary(GetMonData(pokemon, MON_DATA_STATUS)) == AILMENT_PSN)
{
hp = GetMonData(pokemon, MON_DATA_HP);
if (hp == 0 || --hp == 0)
{
numFainted++;
}
SetMonData(pokemon, MON_DATA_HP, &hp);
numPoisoned++;
}
pokemon++;
}
if (numFainted != 0 || numPoisoned != 0)
{
overworld_poison_effect();
}
if (numFainted != 0)
{
return FLDPSN_FNT;
}
if (numPoisoned != 0)
{
return FLDPSN_PSN;
}
return FLDPSN_NONE;
}
+193
View File
@@ -0,0 +1,193 @@
// Includes
#include "global.h"
#include "main.h"
#include "malloc.h"
#include "gpu_regs.h"
#include "bg.h"
#include "text.h"
#include "window.h"
#include "text_window.h"
#include "palette.h"
#include "menu.h"
#include "strings.h"
#include "international_string_util.h"
#include "region_map.h"
// Static type declarations
// Static RAM declarations
static EWRAM_DATA struct {
MainCallback callback;
u32 filler_004;
struct RegionMap regionMap;
u16 state;
} *sFieldRegionMapHandler = NULL;
// Static ROM declarations
static void MCB2_InitRegionMapRegisters(void);
static void VBCB_FieldUpdateRegionMap(void);
static void MCB2_FieldUpdateRegionMap(void);
static void FieldUpdateRegionMap(void);
static void PrintRegionMapSecName(void);
// .rodata
static const struct BgTemplate gUnknown_085E5068[] = {
{
.bg = 0,
.charBaseIndex = 0,
.mapBaseIndex = 31,
.screenSize = 0,
.paletteMode = 0,
.priority = 0,
.baseTile = 0
}, {
.bg = 2,
.charBaseIndex = 2,
.mapBaseIndex = 28,
.screenSize = 2,
.paletteMode = 1,
.priority = 2,
.baseTile = 0
}
};
static const struct WindowTemplate gUnknown_085E5070[] = {
{ 0, 17, 17, 12, 2, 15, 0x0001 },
{ 0, 22, 1, 7, 2, 15, 0x0019 },
DUMMY_WIN_TEMPLATE
};
// .text
void sub_817018C(MainCallback callback)
{
SetVBlankCallback(NULL);
sFieldRegionMapHandler = malloc(sizeof(*sFieldRegionMapHandler));
sFieldRegionMapHandler->state = 0;
sFieldRegionMapHandler->callback = callback;
SetMainCallback2(MCB2_InitRegionMapRegisters);
}
static void MCB2_InitRegionMapRegisters(void)
{
SetGpuReg(REG_OFFSET_DISPCNT, 0);
SetGpuReg(REG_OFFSET_BG0HOFS, 0);
SetGpuReg(REG_OFFSET_BG0VOFS, 0);
SetGpuReg(REG_OFFSET_BG1HOFS, 0);
SetGpuReg(REG_OFFSET_BG1VOFS, 0);
SetGpuReg(REG_OFFSET_BG2HOFS, 0);
SetGpuReg(REG_OFFSET_BG2VOFS, 0);
SetGpuReg(REG_OFFSET_BG3HOFS, 0);
SetGpuReg(REG_OFFSET_BG3VOFS, 0);
ResetSpriteData();
FreeAllSpritePalettes();
ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(1, gUnknown_085E5068, 2);
InitWindows(gUnknown_085E5070);
DeactivateAllTextPrinters();
sub_809882C(0, 0x27, 0xd0);
clear_scheduled_bg_copies_to_vram();
SetMainCallback2(MCB2_FieldUpdateRegionMap);
SetVBlankCallback(VBCB_FieldUpdateRegionMap);
}
static void VBCB_FieldUpdateRegionMap(void)
{
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
}
static void MCB2_FieldUpdateRegionMap(void)
{
FieldUpdateRegionMap();
AnimateSprites();
BuildOamBuffer();
UpdatePaletteFade();
do_scheduled_bg_tilemap_copies_to_vram();
}
static void FieldUpdateRegionMap(void)
{
u8 offset;
switch (sFieldRegionMapHandler->state)
{
case 0:
InitRegionMap(&sFieldRegionMapHandler->regionMap, 0);
CreateRegionMapPlayerIcon(0, 0);
CreateRegionMapCursor(1, 1);
sFieldRegionMapHandler->state++;
break;
case 1:
SetWindowBorderStyle(1, 0, 0x27, 0xd);
offset = GetStringCenterAlignXOffset(1, gText_Hoenn, 0x38);
PrintTextOnWindow(1, 1, gText_Hoenn, offset, 1, 0, NULL);
schedule_bg_copy_tilemap_to_vram(0);
SetWindowBorderStyle(0, 0, 0x27, 0xd);
PrintRegionMapSecName();
BeginNormalPaletteFade(-1, 0, 16, 0, 0);
sFieldRegionMapHandler->state++;
break;
case 2:
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON);
ShowBg(0);
ShowBg(2);
sFieldRegionMapHandler->state++;
break;
case 3:
if (!gPaletteFade.active)
{
sFieldRegionMapHandler->state++;
}
break;
case 4:
switch (sub_81230AC())
{
case INPUT_EVENT_MOVE_END:
PrintRegionMapSecName();
break;
case INPUT_EVENT_A_BUTTON:
case INPUT_EVENT_B_BUTTON:
sFieldRegionMapHandler->state++;
break;
}
break;
case 5:
BeginNormalPaletteFade(-1, 0, 0, 16, 0);
sFieldRegionMapHandler->state++;
break;
case 6:
if (!gPaletteFade.active)
{
FreeRegionMapIconResources();
SetMainCallback2(sFieldRegionMapHandler->callback);
if (sFieldRegionMapHandler != NULL)
{
free(sFieldRegionMapHandler);
sFieldRegionMapHandler = NULL;
}
FreeAllWindowBuffers();
}
break;
}
}
static void PrintRegionMapSecName(void)
{
if (sFieldRegionMapHandler->regionMap.iconDrawType != MAPSECTYPE_NONE)
{
FillWindowPixelBuffer(0, 0x11);
PrintTextOnWindow(0, 1, sFieldRegionMapHandler->regionMap.mapSecName, 0, 1, 0, NULL);
schedule_bg_copy_tilemap_to_vram(0);
}
else
{
FillWindowPixelBuffer(0, 0x11);
CopyWindowToVram(0, 3);
}
}
Executable → Regular
+4 -4
View File
@@ -2,11 +2,11 @@
#include "task.h"
#include "sprite.h"
#include "field_map_obj.h"
#include "songs.h"
#include "constants/songs.h"
#include "sound.h"
#include "palette.h"
#include "script.h"
#include "vars.h"
#include "constants/vars.h"
#include "event_data.h"
#include "main.h"
@@ -211,7 +211,7 @@ void Task_HandleTruckSequence(u8 taskId)
data[1]++;
if (data[1] == 90)
{
PlaySE(SE_TRACK_HAIK);
PlaySE(SE_TRACK_HAIKI);
data[1] = 0;
data[0] = 5;
}
@@ -354,7 +354,7 @@ void sub_80FB768(void)
void sub_80FB7A4(void)
{
FlagSet(SYS_CRUISE_MODE);
FlagSet(FLAG_SYS_CRUISE_MODE);
FlagSet(0x4001);
FlagSet(0x4000);
saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
+46
View File
@@ -0,0 +1,46 @@
#include "global.h"
#include "fldeff_teleport.h"
#include "field_effect.h"
#include "field_player_avatar.h"
#include "party_menu.h"
#include "overworld.h"
#include "rom6.h"
#include "task.h"
extern bool8 (*gUnknown_03005DB0)(void);
extern void (*gUnknown_0203CEEC)(void);
bool8 SetUpFieldMove_Teleport(void)
{
if (Overworld_MapTypeAllowsTeleportAndFly(gMapHeader.mapType) == TRUE)
{
gUnknown_03005DB0 = FieldCallback_Teleport;
gUnknown_0203CEEC = hm_teleport_run_dp02scr;
return TRUE;
}
return FALSE;
}
void hm_teleport_run_dp02scr(void)
{
Overworld_ResetStateAfterTeleport();
FieldEffectStart(FLDEFF_USE_TELEPORT);
gFieldEffectArguments[0] = (u32)GetCursorSelectionMonId();
}
bool8 FldEff_UseTeleport(void)
{
u8 taskId = oei_task_add();
gTasks[taskId].data[8] = (u32)sub_817C94C >> 16;
gTasks[taskId].data[9] = (u32)sub_817C94C;
SetPlayerAvatarTransitionFlags(1);
return FALSE;
}
void sub_817C94C(void)
{
FieldEffectActiveListRemove(FLDEFF_USE_TELEPORT);
sub_80B7FC8();
}
+1553
View File
File diff suppressed because it is too large Load Diff
+83
View File
@@ -0,0 +1,83 @@
// Includes
#include "global.h"
#include "constants/maps.h"
#include "heal_location.h"
#define HEAL_LOCATION(map, x, y) {MAP_GROUP(map), MAP_NUM(map), x, y}
// Static type declarations
// Static RAM declarations
// Static ROM declarations
// .rodata
static const struct HealLocation sHealLocations[] = {
HEAL_LOCATION(LITTLEROOT_TOWN_BRENDANS_HOUSE_2F, 4, 2),
HEAL_LOCATION(LITTLEROOT_TOWN_MAYS_HOUSE_2F, 4, 2),
HEAL_LOCATION(PETALBURG_CITY, 20, 17),
HEAL_LOCATION(SLATEPORT_CITY, 19, 20),
HEAL_LOCATION(MAUVILLE_CITY, 22, 6),
HEAL_LOCATION(RUSTBORO_CITY, 16, 39),
HEAL_LOCATION(FORTREE_CITY, 5, 7),
HEAL_LOCATION(LILYCOVE_CITY, 24, 15),
HEAL_LOCATION(MOSSDEEP_CITY, 28, 17),
HEAL_LOCATION(SOOTOPOLIS_CITY, 43, 32),
HEAL_LOCATION(EVER_GRANDE_CITY, 27, 49),
HEAL_LOCATION(LITTLEROOT_TOWN, 5, 9),
HEAL_LOCATION(LITTLEROOT_TOWN, 14, 9),
HEAL_LOCATION(OLDALE_TOWN, 6, 17),
HEAL_LOCATION(DEWFORD_TOWN, 2, 11),
HEAL_LOCATION(LAVARIDGE_TOWN, 9, 7),
HEAL_LOCATION(FALLARBOR_TOWN, 14, 8),
HEAL_LOCATION(VERDANTURF_TOWN, 16, 4),
HEAL_LOCATION(PACIFIDLOG_TOWN, 8, 16),
HEAL_LOCATION(EVER_GRANDE_CITY, 18, 6),
HEAL_LOCATION(SOUTHERN_ISLAND_EXTERIOR, 15, 20),
HEAL_LOCATION(BATTLE_FRONTIER_OUTSIDE_EAST, 3, 52)
};
#define NUM_HEAL_LOCATIONS (ARRAY_COUNT(sHealLocations))
// .text
static u32 GetHealLocationIndexFromMapGroupAndNum(u16 mapGroup, u16 mapNum)
{
u32 i;
for (i = 0; i < NUM_HEAL_LOCATIONS; i++)
{
if (sHealLocations[i].group == mapGroup && sHealLocations[i].map == mapNum)
{
return i + 1;
}
}
return 0;
}
const struct HealLocation *GetHealLocationPointerFromMapGroupAndNum(u16 mapGroup, u16 mapNum)
{
u32 loc;
loc = GetHealLocationIndexFromMapGroupAndNum(mapGroup, mapNum);
if (loc == 0)
{
return NULL;
}
return &sHealLocations[loc - 1];
}
const struct HealLocation *GetHealLocationPointer(u32 loc)
{
if (loc == 0)
{
return NULL;
}
if (loc > NUM_HEAL_LOCATIONS)
{
return NULL;
}
return &sHealLocations[loc - 1];
}
+46
View File
@@ -0,0 +1,46 @@
#include "global.h"
#include "hall_of_fame.h"
#include "main.h"
#include "palette.h"
#include "overworld.h"
#include "script.h"
#include "script_menu.h"
#include "task.h"
extern void (*gFieldCallback)(void);
extern void (*gUnknown_0300485C)(void);
extern void Overworld_PlaySpecialMapMusic(void);
extern bool16 ScrSpecial_CreatePCMenu(void);
extern void ScriptMenu_DisplayPCStartupPrompt(void);
static void ReshowPCMenuAfterHallOfFamePC(void);
static void Task_WaitForPaletteFade(u8);
void AccessHallOfFamePC(void)
{
SetMainCallback2(CB2_DoHallOfFamePC);
ScriptContext2_Enable();
}
void ReturnFromHallOfFamePC(void)
{
SetMainCallback2(c2_exit_to_overworld_2_switch);
gFieldCallback = ReshowPCMenuAfterHallOfFamePC;
}
static void ReshowPCMenuAfterHallOfFamePC(void)
{
ScriptContext2_Enable();
Overworld_PlaySpecialMapMusic();
ScrSpecial_CreatePCMenu();
ScriptMenu_DisplayPCStartupPrompt();
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0);
CreateTask(Task_WaitForPaletteFade, 10);
}
static void Task_WaitForPaletteFade(u8 taskId)
{
if (!gPaletteFade.active)
DestroyTask(taskId);
}
+1 -1
View File
@@ -1,6 +1,6 @@
#include "global.h"
#include "international_string_util.h"
#include "text.h"
#include "international_string_util.h"
extern s32 convert_pixel_width_to_tile_width(s32 a0); // script menu
+24 -24
View File
@@ -1,17 +1,17 @@
#include "global.h"
#include "item.h"
#include "items.h"
#include "berry.h"
#include "constants/items.h"
#include "string_util.h"
#include "text.h"
#include "event_data.h"
extern void ApplyNewEncyprtionKeyToHword(u16* hword, u32 newKey);
extern void ApplyNewEncryptionKeyToHword(u16* hword, u32 newKey);
extern bool8 InBattlePyramid(void);
extern const u8 gText_PokeBalls[];
extern const u8 gText_Berries[];
extern const u8 gText_Berry[];
extern const u8 gUnknown_085897E4[][28]; // not sure what this one is
bool8 CheckPyramidBagHasItem(u16 itemId, u16 count);
bool8 CheckPyramidBagHasSpace(u16 itemId, u16 count);
@@ -36,39 +36,39 @@ void SetBagItemId(u16* slot, u16 newItemId)
*slot = newItemId;
}
void ApplyNewEncyprtionKeyToBagItems(u32 newKey)
void ApplyNewEncryptionKeyToBagItems(u32 newKey)
{
u32 pocket, item;
for (pocket = 0; pocket < 5; pocket++)
{
for (item = 0; item < gBagPockets[pocket].capacity; item++)
ApplyNewEncyprtionKeyToHword(&(gBagPockets[pocket].itemSlots[item].quantity), newKey);
ApplyNewEncryptionKeyToHword(&(gBagPockets[pocket].itemSlots[item].quantity), newKey);
}
}
void ApplyNewEncyprtionKeyToBagItems_(u32 newKey) // really GF?
void ApplyNewEncryptionKeyToBagItems_(u32 newKey) // really GF?
{
ApplyNewEncyprtionKeyToBagItems(newKey);
ApplyNewEncryptionKeyToBagItems(newKey);
}
// TODO: move those max values to defines
void SetBagItemsPointers(void)
{
gBagPockets[ITEMS_POCKET].itemSlots = gSaveBlock1Ptr->bagPocket_Items;
gBagPockets[ITEMS_POCKET].capacity = 30;
gBagPockets[BAG_ITEMS - 1].itemSlots = gSaveBlock1Ptr->bagPocket_Items;
gBagPockets[BAG_ITEMS - 1].capacity = 30;
gBagPockets[KEYITEMS_POCKET].itemSlots = gSaveBlock1Ptr->bagPocket_KeyItems;
gBagPockets[KEYITEMS_POCKET].capacity = 30;
gBagPockets[BAG_KEYITEMS - 1].itemSlots = gSaveBlock1Ptr->bagPocket_KeyItems;
gBagPockets[BAG_KEYITEMS - 1].capacity = 30;
gBagPockets[BALLS_POCKET].itemSlots = gSaveBlock1Ptr->bagPocket_PokeBalls;
gBagPockets[BALLS_POCKET].capacity = 16;
gBagPockets[BAG_POKEBALLS - 1].itemSlots = gSaveBlock1Ptr->bagPocket_PokeBalls;
gBagPockets[BAG_POKEBALLS - 1].capacity = 16;
gBagPockets[TMHM_POCKET].itemSlots = gSaveBlock1Ptr->bagPocket_TMHM;
gBagPockets[TMHM_POCKET].capacity = 64;
gBagPockets[BAG_TMsHMs - 1].itemSlots = gSaveBlock1Ptr->bagPocket_TMHM;
gBagPockets[BAG_TMsHMs - 1].capacity = 64;
gBagPockets[BERRIES_POCKET].itemSlots = gSaveBlock1Ptr->bagPocket_Berries;
gBagPockets[BERRIES_POCKET].capacity = 46;
gBagPockets[BAG_BERRIES - 1].itemSlots = gSaveBlock1Ptr->bagPocket_Berries;
gBagPockets[BAG_BERRIES - 1].capacity = 46;
}
void CopyItemName(u16 itemId, u8 *string)
@@ -87,8 +87,8 @@ void CopyItemNameHandlePlural(u16 itemId, u8 *string, u32 quantity)
}
else
{
if (itemId >= 0x85 && itemId <= 0xAF)
GetBerryCountString(string, gUnknown_085897E4[itemId], quantity);
if (itemId >= ITEM_CHERI_BERRY && itemId <= ITEM_ENIGMA_BERRY)
GetBerryCountString(string, gBerries[itemId - ITEM_CHERI_BERRY].name, quantity);
else
StringCopy(string, ItemId_GetItem(itemId)->name);
}
@@ -156,11 +156,11 @@ bool8 HasAtLeastOneBerry(void)
{
if (CheckBagHasItem(i, 1) == TRUE)
{
gScriptResult = 1;
gSpecialVar_Result = 1;
return TRUE;
}
}
gScriptResult = 0;
gSpecialVar_Result = 0;
return FALSE;
}
@@ -177,7 +177,7 @@ bool8 CheckBagHasSpace(u16 itemId, u16 count)
if (InBattlePyramid() || FlagGet(0x4004) == TRUE)
return CheckPyramidBagHasSpace(itemId, count);
pocket = ItemId_GetPocket(itemId) - 1;
if (pocket != BERRIES_POCKET)
if (pocket != BAG_BERRIES)
slotCapacity = 99;
else
slotCapacity = 999;
@@ -190,7 +190,7 @@ bool8 CheckBagHasSpace(u16 itemId, u16 count)
quantity = GetBagItemQuantity(&gBagPockets[pocket].itemSlots[i].quantity);
if (quantity + count <= slotCapacity)
return TRUE;
if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET)
if (pocket == BAG_TMsHMs || pocket == BAG_BERRIES)
return FALSE;
count -= slotCapacity - quantity;
if (count == 0)
@@ -207,7 +207,7 @@ bool8 CheckBagHasSpace(u16 itemId, u16 count)
{
if (count <= slotCapacity)
return TRUE;
if (pocket == TMHM_POCKET || pocket == BERRIES_POCKET)
if (pocket == BAG_TMsHMs || pocket == BAG_BERRIES)
return FALSE;
count -= slotCapacity;
}
+169
View File
@@ -0,0 +1,169 @@
#include "global.h"
#include "item_icon.h"
#include "malloc.h"
#include "sprite.h"
#include "decompress.h"
#include "constants/items.h"
// EWRAM vars
EWRAM_DATA void *gItemIconDecompressionBuffer = NULL;
EWRAM_DATA void *gItemIcon4x4Buffer = NULL;
// const rom data
extern const void *const gItemIconTable[][2]; // todo: move to C file
static const struct OamData sOamData_ItemIcon =
{
.y = 0,
.affineMode = 0,
.objMode = 0,
.mosaic = 0,
.bpp = 0,
.shape = 0,
.x = 0,
.matrixNum = 0,
.size = 2,
.tileNum = 0,
.priority = 1,
.paletteNum = 2,
.affineParam = 0
};
static const union AnimCmd sSpriteAnim_ItemIcon[] =
{
ANIMCMD_FRAME(0, 0),
ANIMCMD_END
};
static const union AnimCmd *const sSpriteAnimTable_ItemIcon[] =
{
sSpriteAnim_ItemIcon
};
const struct SpriteTemplate gItemIconSpriteTemplate =
{
.tileTag = 0,
.paletteTag = 0,
.oam = &sOamData_ItemIcon,
.anims = sSpriteAnimTable_ItemIcon,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy,
};
// code
bool8 AllocItemIconTemporaryBuffers(void)
{
gItemIconDecompressionBuffer = gItemIconDecompressionBuffer; // needed to match
gItemIconDecompressionBuffer = Alloc(0x120);
if (gItemIconDecompressionBuffer == NULL)
return FALSE;
gItemIcon4x4Buffer = gItemIcon4x4Buffer; // needed to match
gItemIcon4x4Buffer = AllocZeroed(0x200);
if (gItemIcon4x4Buffer == NULL)
{
Free(gItemIconDecompressionBuffer);
return FALSE;
}
return TRUE;
}
void FreeItemIconTemporaryBuffers(void)
{
Free(gItemIconDecompressionBuffer);
Free(gItemIcon4x4Buffer);
}
void CopyItemIconPicTo4x4Buffer(const void *src, void *dest)
{
u8 i;
for (i = 0; i < 3; i++)
CpuCopy16(src + i * 96, dest + i * 128, 0x60);
}
u8 AddItemIconSprite(u16 tilesTag, u16 paletteTag, u16 itemId)
{
if (!AllocItemIconTemporaryBuffers())
{
return MAX_SPRITES;
}
else
{
u8 spriteId;
struct SpriteSheet spriteSheet;
struct CompressedSpritePalette spritePalette;
struct SpriteTemplate *spriteTemplate;
LZDecompressWram(GetItemIconPicOrPalette(itemId, 0), gItemIconDecompressionBuffer);
CopyItemIconPicTo4x4Buffer(gItemIconDecompressionBuffer, gItemIcon4x4Buffer);
spriteSheet.data = gItemIcon4x4Buffer;
spriteSheet.size = 0x200;
spriteSheet.tag = tilesTag;
LoadSpriteSheet(&spriteSheet);
spritePalette.data = GetItemIconPicOrPalette(itemId, 1);
spritePalette.tag = paletteTag;
LoadCompressedObjectPalette(&spritePalette);
spriteTemplate = Alloc(sizeof(*spriteTemplate));
CpuCopy16(&gItemIconSpriteTemplate, spriteTemplate, sizeof(*spriteTemplate));
spriteTemplate->tileTag = tilesTag;
spriteTemplate->paletteTag = paletteTag;
spriteId = CreateSprite(spriteTemplate, 0, 0, 0);
FreeItemIconTemporaryBuffers();
Free(spriteTemplate);
return spriteId;
}
}
u8 AddCustomItemIconSprite(struct SpriteTemplate *customSpriteTemplate, u16 tilesTag, u16 paletteTag, u16 itemId)
{
if (!AllocItemIconTemporaryBuffers())
{
return MAX_SPRITES;
}
else
{
u8 spriteId;
struct SpriteSheet spriteSheet;
struct CompressedSpritePalette spritePalette;
struct SpriteTemplate *spriteTemplate;
LZDecompressWram(GetItemIconPicOrPalette(itemId, 0), gItemIconDecompressionBuffer);
CopyItemIconPicTo4x4Buffer(gItemIconDecompressionBuffer, gItemIcon4x4Buffer);
spriteSheet.data = gItemIcon4x4Buffer;
spriteSheet.size = 0x200;
spriteSheet.tag = tilesTag;
LoadSpriteSheet(&spriteSheet);
spritePalette.data = GetItemIconPicOrPalette(itemId, 1);
spritePalette.tag = paletteTag;
LoadCompressedObjectPalette(&spritePalette);
spriteTemplate = Alloc(sizeof(*spriteTemplate));
CpuCopy16(customSpriteTemplate, spriteTemplate, sizeof(*spriteTemplate));
spriteTemplate->tileTag = tilesTag;
spriteTemplate->paletteTag = paletteTag;
spriteId = CreateSprite(spriteTemplate, 0, 0, 0);
FreeItemIconTemporaryBuffers();
Free(spriteTemplate);
return spriteId;
}
}
const void *GetItemIconPicOrPalette(u16 itemId, u8 which)
{
if (itemId == 0xFFFF)
itemId = ITEM_FIELD_ARROW;
else if (itemId > ITEM_LAST_ID)
itemId = 0;
return gItemIconTable[itemId][which];
}
Executable
+1122
View File
File diff suppressed because it is too large Load Diff
+441
View File
@@ -0,0 +1,441 @@
#include "global.h"
#include "event_data.h"
#include "constants/region_map_sections.h"
struct Landmark
{
const u8 *name;
u16 flag;
};
struct LandmarkList
{
u8 mapSection;
u8 id;
const struct Landmark *const *landmarks;
};
static const u8 LandmarkName_FlowerShop[] = _("FLOWER SHOP");
static const u8 LandmarkName_PetalburgWoods[] = _("PETALBURG WOODS");
static const u8 LandmarkName_MrBrineysCottage[] = _("MR. BRINEYS COTTAGE");
static const u8 LandmarkName_AbandonedShip[] = _("ABANDONED SHIP");
static const u8 LandmarkName_SeashoreHouse[] = _("SEASHORE HOUSE");
static const u8 LandmarkName_SlateportBeach[] = _("SLATEPORT BEACH");
static const u8 LandmarkName_CyclingRoad[] = _("CYCLING ROAD");
static const u8 LandmarkName_NewMauville[] = _("NEW MAUVILLE");
static const u8 LandmarkName_TrickHouse[] = _("TRICK HOUSE");
static const u8 LandmarkName_OldLadysRestShop[] = _("OLD LADYS REST STOP");
static const u8 LandmarkName_Desert[] = _("DESERT");
static const u8 LandmarkName_WinstrateFamily[] = _("THE WINSTRATE FAMILY");
static const u8 LandmarkName_CableCar[] = _("CABLE CAR");
static const u8 LandmarkName_GlassWorkshop[] = _("GLASS WORKSHOP");
static const u8 LandmarkName_WeatherInstitute[] = _("WEATHER INSTITUTE");
static const u8 LandmarkName_MeteorFalls[] = _("METEOR FALLS");
static const u8 LandmarkName_TunnelersRestHouse[] = _("TUNNELERS RESTHOUSE");
static const u8 LandmarkName_RusturfTunnel[] = _("RUSTURF TUNNEL");
static const u8 LandmarkName_PokemonDayCare[] = _("POKéMON DAY CARE");
static const u8 LandmarkName_SafariZoneEntrance[] = _("SAFARI ZONE ENTRANCE");
static const u8 LandmarkName_MtPyre[] = _("MT. PYRE");
static const u8 LandmarkName_ShoalCave[] = _("SHOAL CAVE");
static const u8 LandmarkName_SeafloorCavern[] = _("SEAFLOOR CAVERN");
static const u8 LandmarkName_GraniteCave[] = _("GRANITE CAVE");
static const u8 LandmarkName_OceanCurrent[] = _("OCEAN CURRENT");
static const u8 LandmarkName_LanettesHouse[] = _("LANETTES HOUSE");
static const u8 LandmarkName_FieryPath[] = _("FIERY PATH");
static const u8 LandmarkName_JaggedPass[] = _("JAGGED PASS");
static const u8 LandmarkName_SkyPillar[] = _("SKY PILLAR");
static const u8 LandmarkName_BerryMastersHouse[] = _("BERRY MASTERS HOUSE");
static const u8 LandmarkName_IslandCave[] = _("ISLAND CAVE");
static const u8 LandmarkName_DesertRuins[] = _("DESERT RUINS");
static const u8 LandmarkName_ScorchedSlab[] = _("SCORCHED SLAB");
static const u8 LandmarkName_AncientTomb[] = _("ANCIENT TOMB");
static const u8 LandmarkName_SealedChamber[] = _("SEALED CHAMBER");
static const u8 LandmarkName_FossilManiacsHouse[] = _("FOSSIL MANIACS HOUSE");
static const u8 LandmarkName_HuntersHouse[] = _("HUNTERS HOUSE");
static const u8 LandmarkName_MagmaHideout[] = _("MAGMA HIDEOUT");
static const u8 LandmarkName_MirageTower[] = _("MIRAGE TOWER");
static const u8 LandmarkName_AlteringCave[] = _("ALTERING CAVE");
static const u8 LandmarkName_DesertUnderpass[] = _("DESERT UNDERPASS");
static const u8 LandmarkName_TrainerHill[] = _("TRAINER HILL");
static const struct Landmark Landmark_FlowerShop = {LandmarkName_FlowerShop, FLAG_LANDMARK_FLOWER_SHOP};
static const struct Landmark Landmark_PetalburgWoods = {LandmarkName_PetalburgWoods, -1};
static const struct Landmark Landmark_MrBrineysCottage = {LandmarkName_MrBrineysCottage, FLAG_LANDMARK_MR_BRINEY_HOUSE};
static const struct Landmark Landmark_AbandonedShip = {LandmarkName_AbandonedShip, FLAG_LANDMARK_ABANDONED_SHIP};
static const struct Landmark Landmark_SeashoreHouse = {LandmarkName_SeashoreHouse, FLAG_LANDMARK_SEASHORE_HOUSE};
static const struct Landmark Landmark_SlateportBeach = {LandmarkName_SlateportBeach, -1};
static const struct Landmark Landmark_CyclingRoad = {LandmarkName_CyclingRoad, -1};
static const struct Landmark Landmark_NewMauville = {LandmarkName_NewMauville, FLAG_LANDMARK_NEW_MAUVILLE};
static const struct Landmark Landmark_TrickHouse = {LandmarkName_TrickHouse, FLAG_LANDMARK_TRICK_HOUSE};
static const struct Landmark Landmark_OldLadysRestShop = {LandmarkName_OldLadysRestShop, FLAG_LANDMARK_OLD_LADY_REST_SHOP};
static const struct Landmark Landmark_Desert = {LandmarkName_Desert, -1};
static const struct Landmark Landmark_WinstrateFamily = {LandmarkName_WinstrateFamily, FLAG_LANDMARK_WINSTRATE_FAMILY};
static const struct Landmark Landmark_CableCar = {LandmarkName_CableCar, -1};
static const struct Landmark Landmark_GlassWorkshop = {LandmarkName_GlassWorkshop, FLAG_LANDMARK_GLASS_WORKSHOP};
static const struct Landmark Landmark_WeatherInstitute = {LandmarkName_WeatherInstitute, -1};
static const struct Landmark Landmark_MeteorFalls = {LandmarkName_MeteorFalls, -1};
static const struct Landmark Landmark_TunnelersRestHouse = {LandmarkName_TunnelersRestHouse, FLAG_LANDMARK_TUNNELERS_REST_HOUSE};
static const struct Landmark Landmark_RusturfTunnel = {LandmarkName_RusturfTunnel, -1};
static const struct Landmark Landmark_PokemonDayCare = {LandmarkName_PokemonDayCare, FLAG_LANDMARK_POKEMON_DAYCARE};
static const struct Landmark Landmark_SafariZoneEntrance = {LandmarkName_SafariZoneEntrance, -1};
static const struct Landmark Landmark_MtPyre = {LandmarkName_MtPyre, -1};
static const struct Landmark Landmark_ShoalCave = {LandmarkName_ShoalCave, -1};
static const struct Landmark Landmark_SeafloorCavern = {LandmarkName_SeafloorCavern, FLAG_LANDMARK_SEAFLOOR_CAVERN};
static const struct Landmark Landmark_GraniteCave = {LandmarkName_GraniteCave, -1};
static const struct Landmark Landmark_OceanCurrent = {LandmarkName_OceanCurrent, -1};
static const struct Landmark Landmark_LanettesHouse = {LandmarkName_LanettesHouse, FLAG_LANDMARK_LANETTES_HOUSE};
static const struct Landmark Landmark_FieryPath = {LandmarkName_FieryPath, FLAG_LANDMARK_FIERY_PATH};
static const struct Landmark Landmark_JaggedPass = {LandmarkName_JaggedPass, -1};
static const struct Landmark Landmark_BerryMastersHouse = {LandmarkName_BerryMastersHouse, FLAG_LANDMARK_BERRY_MASTERS_HOUSE};
static const struct Landmark Landmark_IslandCave = {LandmarkName_IslandCave, FLAG_LANDMARK_ISLAND_CAVE};
static const struct Landmark Landmark_DesertRuins = {LandmarkName_DesertRuins, FLAG_LANDMARK_DESERT_RUINS};
static const struct Landmark Landmark_ScorchedSlab = {LandmarkName_ScorchedSlab, FLAG_LANDMARK_SCORCHED_SLAB};
static const struct Landmark Landmark_AncientTomb = {LandmarkName_AncientTomb, FLAG_LANDMARK_ANCIENT_TOMB};
static const struct Landmark Landmark_SealedChamber = {LandmarkName_SealedChamber, FLAG_LANDMARK_SEALED_CHAMBER};
static const struct Landmark Landmark_FossilManiacsHouse = {LandmarkName_FossilManiacsHouse, FLAG_LANDMARK_FOSSIL_MANIACS_HOUSE};
static const struct Landmark Landmark_HuntersHouse = {LandmarkName_HuntersHouse, FLAG_LANDMARK_HUNTERS_HOUSE};
static const struct Landmark Landmark_SkyPillar = {LandmarkName_SkyPillar, FLAG_LANDMARK_SKY_PILLAR};
static const struct Landmark Landmark_MirageTower = {LandmarkName_MirageTower, FLAG_LANDMARK_MIRAGE_TOWER};
static const struct Landmark Landmark_AlteringCave = {LandmarkName_AlteringCave, FLAG_LANDMARK_ALTERING_CAVE};
static const struct Landmark Landmark_DesertUnderpass = {LandmarkName_DesertUnderpass, FLAG_LANDMARK_DESERT_UNDERPASS};
static const struct Landmark Landmark_TrainerHill = {LandmarkName_TrainerHill, FLAG_LANDMARK_TRAINER_HILL};
static const struct Landmark *const Landmarks_Route103_2[] =
{
&Landmark_AlteringCave,
NULL,
};
static const struct Landmark *const Landmarks_Route104_0[] =
{
&Landmark_FlowerShop,
NULL,
};
static const struct Landmark *const Landmarks_Route104_1[] =
{
&Landmark_PetalburgWoods,
&Landmark_MrBrineysCottage,
NULL,
};
static const struct Landmark *const Landmarks_Route105_0[] =
{
&Landmark_IslandCave,
NULL,
};
static const struct Landmark *const Landmarks_Route106_1[] =
{
&Landmark_GraniteCave,
NULL,
};
static const struct Landmark *const Landmarks_Route108_0[] =
{
&Landmark_AbandonedShip,
NULL,
};
static const struct Landmark *const Landmarks_Route109_0[] =
{
&Landmark_SeashoreHouse,
&Landmark_SlateportBeach,
NULL,
};
static const struct Landmark *const Landmarks_Route110_0[] =
{
&Landmark_CyclingRoad,
&Landmark_NewMauville,
NULL,
};
static const struct Landmark *const Landmarks_Route110_1[] =
{
&Landmark_CyclingRoad,
NULL,
};
static const struct Landmark *const Landmarks_Route110_2[] =
{
&Landmark_CyclingRoad,
&Landmark_TrickHouse,
NULL,
};
static const struct Landmark *const Landmarks_Route111_0[] =
{
&Landmark_OldLadysRestShop,
NULL,
};
static const struct Landmark *const Landmarks_Route111_1[] =
{
&Landmark_Desert,
NULL,
};
static const struct Landmark *const Landmarks_Route111_2[] =
{
&Landmark_MirageTower,
&Landmark_Desert,
NULL,
};
static const struct Landmark *const Landmarks_Route111_3[] =
{
&Landmark_DesertRuins,
&Landmark_Desert,
NULL,
};
static const struct Landmark *const Landmarks_Route111_4[] =
{
&Landmark_TrainerHill,
&Landmark_WinstrateFamily,
&Landmark_Desert,
NULL,
};
static const struct Landmark *const Landmarks_Route112_0[] =
{
&Landmark_FieryPath,
&Landmark_JaggedPass,
NULL,
};
static const struct Landmark *const Landmarks_Route112_1[] =
{
&Landmark_CableCar,
&Landmark_FieryPath,
NULL,
};
static const struct Landmark *const Landmarks_Route113_1[] =
{
&Landmark_GlassWorkshop,
NULL,
};
static const struct Landmark *const Landmarks_Route114_1[] =
{
&Landmark_DesertUnderpass,
&Landmark_FossilManiacsHouse,
NULL,
};
static const struct Landmark *const Landmarks_Route114_2[] =
{
&Landmark_LanettesHouse,
NULL,
};
static const struct Landmark *const Landmarks_MeteorFalls[] =
{
&Landmark_MeteorFalls,
NULL,
};
static const struct Landmark *const Landmarks_Route116_1[] =
{
&Landmark_TunnelersRestHouse,
&Landmark_RusturfTunnel,
NULL,
};
static const struct Landmark *const Landmarks_Route116_2[] =
{
&Landmark_RusturfTunnel,
NULL,
};
static const struct Landmark *const Landmarks_Route117_2[] =
{
&Landmark_PokemonDayCare,
NULL,
};
static const struct Landmark *const Landmarks_Route119_1[] =
{
&Landmark_WeatherInstitute,
NULL,
};
static const struct Landmark *const Landmarks_Route120_0[] =
{
&Landmark_ScorchedSlab,
NULL,
};
static const struct Landmark *const Landmarks_Route120_2[] =
{
&Landmark_AncientTomb,
NULL,
};
static const struct Landmark *const Landmarks_Route121_2[] =
{
&Landmark_SafariZoneEntrance,
NULL,
};
static const struct Landmark *const Landmarks_Route122_0[] =
{
&Landmark_MtPyre,
NULL,
};
static const struct Landmark *const Landmarks_Route123_0[] =
{
&Landmark_BerryMastersHouse,
NULL,
};
static const struct Landmark *const Landmarks_Route124_7[] =
{
&Landmark_HuntersHouse,
NULL,
};
static const struct Landmark *const Landmarks_Route125_2[] =
{
&Landmark_ShoalCave,
NULL,
};
static const struct Landmark *const Landmarks_Route128_1[] =
{
&Landmark_SeafloorCavern,
NULL,
};
static const struct Landmark *const Landmarks_Route131_1[] =
{
&Landmark_SkyPillar,
NULL,
};
static const struct Landmark *const Landmarks_OceanCurrent[] =
{
&Landmark_OceanCurrent,
NULL,
};
static const struct Landmark *const Landmarks_Route134_2[] =
{
&Landmark_SealedChamber,
&Landmark_OceanCurrent,
NULL,
};
static const struct Landmark *const Landmarks_MtChimney_2[] =
{
&Landmark_CableCar,
&Landmark_JaggedPass,
NULL,
};
static const struct LandmarkList gLandmarkLists[] =
{
{MAPSEC_ROUTE_103, 2, Landmarks_Route103_2},
{MAPSEC_ROUTE_104, 0, Landmarks_Route104_0},
{MAPSEC_ROUTE_104, 1, Landmarks_Route104_1},
{MAPSEC_ROUTE_105, 0, Landmarks_Route105_0},
{MAPSEC_ROUTE_106, 1, Landmarks_Route106_1},
{MAPSEC_ROUTE_108, 0, Landmarks_Route108_0},
{MAPSEC_ROUTE_109, 0, Landmarks_Route109_0},
{MAPSEC_ROUTE_110, 0, Landmarks_Route110_0},
{MAPSEC_ROUTE_110, 1, Landmarks_Route110_1},
{MAPSEC_ROUTE_110, 2, Landmarks_Route110_2},
{MAPSEC_ROUTE_111, 0, Landmarks_Route111_0},
{MAPSEC_ROUTE_111, 1, Landmarks_Route111_1},
{MAPSEC_ROUTE_111, 2, Landmarks_Route111_2},
{MAPSEC_ROUTE_111, 3, Landmarks_Route111_3},
{MAPSEC_ROUTE_111, 4, Landmarks_Route111_4},
{MAPSEC_ROUTE_112, 0, Landmarks_Route112_0},
{MAPSEC_ROUTE_112, 1, Landmarks_Route112_1},
{MAPSEC_ROUTE_113, 1, Landmarks_Route113_1},
{MAPSEC_ROUTE_114, 1, Landmarks_Route114_1},
{MAPSEC_ROUTE_114, 2, Landmarks_Route114_2},
{MAPSEC_ROUTE_114, 3, Landmarks_MeteorFalls},
{MAPSEC_ROUTE_115, 0, Landmarks_MeteorFalls},
{MAPSEC_ROUTE_115, 1, Landmarks_MeteorFalls},
{MAPSEC_ROUTE_116, 1, Landmarks_Route116_1},
{MAPSEC_ROUTE_116, 2, Landmarks_Route116_2},
{MAPSEC_ROUTE_117, 2, Landmarks_Route117_2},
{MAPSEC_ROUTE_119, 1, Landmarks_Route119_1},
{MAPSEC_ROUTE_120, 0, Landmarks_Route120_0},
{MAPSEC_ROUTE_120, 2, Landmarks_Route120_2},
{MAPSEC_ROUTE_121, 2, Landmarks_Route121_2},
{MAPSEC_ROUTE_122, 0, Landmarks_Route122_0},
{MAPSEC_ROUTE_123, 0, Landmarks_Route123_0},
{MAPSEC_ROUTE_122, 1, Landmarks_Route122_0},
{MAPSEC_ROUTE_124, 7, Landmarks_Route124_7},
{MAPSEC_ROUTE_125, 2, Landmarks_Route125_2},
{MAPSEC_ROUTE_128, 1, Landmarks_Route128_1},
{MAPSEC_ROUTE_131, 1, Landmarks_Route131_1},
{MAPSEC_ROUTE_132, 0, Landmarks_OceanCurrent},
{MAPSEC_ROUTE_132, 1, Landmarks_OceanCurrent},
{MAPSEC_ROUTE_133, 0, Landmarks_OceanCurrent},
{MAPSEC_ROUTE_133, 1, Landmarks_OceanCurrent},
{MAPSEC_ROUTE_133, 2, Landmarks_OceanCurrent},
{MAPSEC_ROUTE_134, 0, Landmarks_OceanCurrent},
{MAPSEC_ROUTE_134, 1, Landmarks_OceanCurrent},
{MAPSEC_ROUTE_134, 2, Landmarks_Route134_2},
{MAPSEC_MT_CHIMNEY, 2, Landmarks_MtChimney_2},
{MAPSEC_NONE, 0, NULL},
};
static const struct Landmark *const *GetLandmarks(u8 mapSection, u8 id);
const u8 *GetLandmarkName(u8 mapSection, u8 id, u8 count)
{
const struct Landmark *const *landmarks = GetLandmarks(mapSection, id);
if (!landmarks)
return NULL;
while (1)
{
const struct Landmark *landmark = *landmarks;
if (landmark->flag == 0xFFFF || FlagGet(landmark->flag) == TRUE)
{
if (count == 0)
break;
else
count--;
}
landmarks++;
if (!*landmarks)
return NULL;
}
return (*landmarks)->name;
}
static const struct Landmark *const *GetLandmarks(u8 mapSection, u8 id)
{
u16 i = 0;
for (; gLandmarkLists[i].mapSection != MAPSEC_NONE; i++)
{
if (gLandmarkLists[i].mapSection > mapSection)
return NULL;
if (gLandmarkLists[i].mapSection == mapSection)
break;
}
if (gLandmarkLists[i].mapSection == MAPSEC_NONE)
return NULL;
for (; gLandmarkLists[i].mapSection == mapSection; i++)
{
if (gLandmarkLists[i].id == id)
return gLandmarkLists[i].landmarks;
}
return NULL;
}
-173
View File
@@ -1,173 +0,0 @@
#include "global.h"
#include <stddef.h>
#define LBLOCKSIZE (sizeof(long))
// Nonzero if (long)X contains a NULL byte.
#define CONTAINSNULL(X) (((X) - 0x01010101) & ~(X) & 0x80808080)
// Nonzero if X is not aligned on a "long" boundary.
#define UNALIGNED(X) ((long)X & (LBLOCKSIZE - 1))
void *memcpy(void *dst0, const void *src0, size_t len0)
{
char *dst = dst0;
const char *src = src0;
long *aligned_dst;
const long *aligned_src;
unsigned int len = len0;
// If the size is small, or either src or dst is unaligned,
// then go to the byte copy loop. This should be rare.
if(len >= 16 && !(UNALIGNED(src) | UNALIGNED(dst)))
{
aligned_dst = (long *)dst;
aligned_src = (long *)src;
// Copy 4X long words at a time if possible.
while(len >= 16)
{
*aligned_dst++ = *aligned_src++;
*aligned_dst++ = *aligned_src++;
*aligned_dst++ = *aligned_src++;
*aligned_dst++ = *aligned_src++;
len -= 16;
}
// Copy one long word at a time if possible
while(len >= 4)
{
*aligned_dst++ = *aligned_src++;
len -= 4;
}
dst = (char *)aligned_dst;
src = (char *)aligned_src;
}
// Pick up any remaining bytes with a byte copier.
while(len--)
*dst++ = *src++;
return dst0;
}
void *memset(void *m, int c, size_t n)
{
char *s = (char *)m;
int count, i;
unsigned long buffer;
unsigned long *aligned_addr;
unsigned char *unaligned_addr;
// If the size is small or m is unaligned,
// then go to the byte copy loop. This should be rare.
if(n >= LBLOCKSIZE && !UNALIGNED(m))
{
// We know that n is large and m is word-aligned.
aligned_addr = (unsigned long *)m;
// Store C into each char sized location in buffer so that
// we can set large blocks quickly.
c &= 0xFF;
if(LBLOCKSIZE == 4)
{
buffer = (c << 8) | c;
buffer |= (buffer << 16);
}
else
{
buffer = 0;
for(i = 0; i < LBLOCKSIZE; i++)
buffer = (buffer << 8) | c;
}
while(n >= LBLOCKSIZE * 4)
{
*aligned_addr++ = buffer;
*aligned_addr++ = buffer;
*aligned_addr++ = buffer;
*aligned_addr++ = buffer;
n -= LBLOCKSIZE * 4;
}
while(n >= LBLOCKSIZE)
{
*aligned_addr++ = buffer;
n -= LBLOCKSIZE;
}
s = (char *)aligned_addr;
}
// Pick up the remainder with a bytewise loop.
while(n--)
*s++ = (char)c;
return m;
}
int strcmp(const char *s1, const char *s2)
{
unsigned long *a1;
unsigned long *a2;
// If s1 or s2 are unaligned, then skip this and compare bytes.
if(!(UNALIGNED(s1) | UNALIGNED(s2)))
{
// Compare them a word at a time.
a1 = (unsigned long *)s1;
a2 = (unsigned long *)s2;
while(*a1 == *a2)
{
// If *a1 == *a2, and we find a null in *a1,
// then the strings must be equal, so return zero.
if(CONTAINSNULL(*a1))
return 0;
a1++;
a2++;
}
s1 = (char *)a1;
s2 = (char *)a2;
}
// Check the remaining few bytes.
while(*s1 != '\0' && *s1 == *s2)
{
s1++;
s2++;
}
return (*(unsigned char *) s1) - (*(unsigned char *) s2);
}
char* strcpy(char *dst0, const char *src0)
{
char *dst = dst0;
const char *src = src0;
unsigned long *a1;
const unsigned long *a2;
// If SRC or DEST is unaligned, then copy bytes.
if(!(UNALIGNED(src) | UNALIGNED(dst)))
{
// SRC and DEST are both "long int" aligned, try to do "long int"
// sized copies.
a1 = (unsigned long *)dst;
a2 = (unsigned long *)src;
while(!CONTAINSNULL(*a2))
{
*a1++ = *a2++;
}
dst = (char *)a1;
src = (char *)a2;
}
// Copy the remaining few bytes.
while(*dst++ = *src++);
return dst0;
}
+177
View File
@@ -0,0 +1,177 @@
#include <stdarg.h>
#include <stdio.h>
#include "gba/gba.h"
#include "config.h"
#define AGB_PRINT_FLUSH_ADDR 0x9FE209D
#define AGB_PRINT_STRUCT_ADDR 0x9FE20F8
#define AGB_PRINT_PROTECT_ADDR 0x9FE2FFE
#define WSCNT_DATA (WAITCNT_PHI_OUT_16MHZ | WAITCNT_WS0_S_2 | WAITCNT_WS0_N_4)
// originally for auto no$gba support, the string "no$gba" should be at this address,
// the user needs to read this string out as the memory viewer won't show it.
#define NOCASHGBAIDADDR 0x4FFFA00
#define NOCASHGBAPRINTADDR1 0x4FFFA10 // automatically adds a newline after the string has finished
#define NOCASHGBAPRINTADDR2 0x4FFFA14 // does not automatically add the newline. by default, NOCASHGBAPRINTADDR2 is used. this is used to keep strings consistent between no$gba and VBA-RR, but a user can choose to forgo this.
struct AGBPrintStruct
{
u16 m_nRequest;
u16 m_nBank;
u16 m_nGet;
u16 m_nPut;
};
typedef void (*LPFN_PRINT_FLUSH)(void);
#ifndef NDEBUG
void AGBPrintFlush1Block(void);
void AGBPrintInit(void)
{
volatile struct AGBPrintStruct *pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR;
u16 *pWSCNT = (u16 *)REG_ADDR_WAITCNT;
u16 *pProtect = (u16 *)AGB_PRINT_PROTECT_ADDR;
u16 nOldWSCNT = *pWSCNT;
*pWSCNT = WSCNT_DATA;
*pProtect = 0x20;
pPrint->m_nRequest = pPrint->m_nGet = pPrint->m_nPut = 0;
pPrint->m_nBank = 0xFD;
*pProtect = 0;
*pWSCNT = nOldWSCNT;
}
static void AGBPutcInternal(const char cChr)
{
volatile struct AGBPrintStruct *pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR;
u16 *pPrintBuf = (u16 *)(0x8000000 + (pPrint->m_nBank << 16));
u16 *pProtect = (u16 *)AGB_PRINT_PROTECT_ADDR;
u16 nData = pPrintBuf[pPrint->m_nPut / 2];
*pProtect = 0x20;
nData = (pPrint->m_nPut & 1) ? (nData & 0xFF) | (cChr << 8) : (nData & 0xFF00) | cChr;
pPrintBuf[pPrint->m_nPut / 2] = nData;
pPrint->m_nPut++;
*pProtect = 0;
}
void AGBPutc(const char cChr)
{
u16 *pWSCNT = (u16 *)REG_ADDR_WAITCNT;
u16 nOldWSCNT = *pWSCNT;
volatile struct AGBPrintStruct *pPrint;
*pWSCNT = WSCNT_DATA;
AGBPutcInternal(cChr);
*pWSCNT = nOldWSCNT;
pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR;
if (pPrint->m_nPut == ((pPrint->m_nGet - 1) & 0xFFFF))
AGBPrintFlush1Block();
}
void AGBPrint(const char *pBuf)
{
volatile struct AGBPrintStruct *pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR;
u16 *pWSCNT = (u16 *)REG_ADDR_WAITCNT;
u16 nOldWSCNT = *pWSCNT;
*pWSCNT = WSCNT_DATA;
while (*pBuf)
{
AGBPutc(*pBuf);
pBuf++;
}
*pWSCNT = nOldWSCNT;
}
void AGBPrintf(const char *pBuf, ...)
{
char bufPrint[0x100];
va_list vArgv;
va_start(vArgv, pBuf);
vsprintf(bufPrint, pBuf, vArgv);
va_end(vArgv);
AGBPrint(bufPrint);
}
static void AGBPrintTransferDataInternal(u32 bAllData)
{
LPFN_PRINT_FLUSH lpfnFuncFlush;
u16 *pIME;
u16 nIME;
u16 *pWSCNT;
u16 nOldWSCNT;
u16 *pProtect;
volatile struct AGBPrintStruct *pPrint;
pProtect = (u16 *)AGB_PRINT_PROTECT_ADDR;
pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR;
lpfnFuncFlush = (LPFN_PRINT_FLUSH)AGB_PRINT_FLUSH_ADDR;
pIME = (u16 *)REG_ADDR_IME;
nIME = *pIME;
pWSCNT = (u16 *)REG_ADDR_WAITCNT;
nOldWSCNT = *pWSCNT;
*pIME = nIME & ~1;
*pWSCNT = WSCNT_DATA;
if (bAllData)
{
while (pPrint->m_nPut != pPrint->m_nGet)
{
*pProtect = 0x20;
lpfnFuncFlush();
*pProtect = 0;
}
}
else if (pPrint->m_nPut != pPrint->m_nGet)
{
*pProtect = 0x20;
lpfnFuncFlush();
*pProtect = 0;
}
*pWSCNT = nOldWSCNT;
*pIME = nIME;
}
void AGBPrintFlush1Block(void)
{
AGBPrintTransferDataInternal(FALSE);
}
void AGBPrintFlush(void)
{
AGBPrintTransferDataInternal(TRUE);
}
void AGBAssert(const char *pFile, int nLine, const char *pExpression, int nStopProgram)
{
if (nStopProgram)
{
AGBPrintf("ASSERTION FAILED FILE=[%s] LINE=[%d] EXP=[%s] \n", pFile, nLine, pExpression);
AGBPrintFlush();
asm(".hword 0xEFFF");
}
else
{
AGBPrintf("WARING FILE=[%s] LINE=[%d] EXP=[%s] \n", pFile, nLine, pExpression);
}
}
// no$gba print functions, uncomment to use
/*
void NoCashGBAPrint(const char *pBuf)
{
*(volatile u32*)NOCASHGBAPRINTADDR2 = (u32)pBuf;
}
void NoCashGBAPrintf(const char *pBuf, ...)
{
char bufPrint[0x100];
va_list vArgv;
va_start(vArgv, pBuf);
vsprintf(bufPrint, pBuf, vArgv);
va_end(vArgv);
NoCashGBAPrint(bufPrint);
}
*/
#endif
+26 -26
View File
@@ -8,10 +8,10 @@
#include "rom6.h"
#include "event_data.h"
#include "script.h"
#include "rng.h"
#include "random.h"
#include "string_util.h"
#include "item.h"
#include "items.h"
#include "constants/items.h"
#include "item_menu.h"
#include "text.h"
#include "easy_chat.h"
@@ -29,10 +29,10 @@ static u8 sub_818E258(const u8 *);
extern const u8 gText_Lady2[];
static const u16 gUnknown_0860B074[] = {
static const u16 sUnknown_0860B074[] = {
0x62, 0xcb, 0xdc, 0xcc, 0xd1
};
static const u16 gUnknown_0860B07E[] = {
static const u16 sUnknown_0860B07E[] = {
0x1a, 0x14, 0x0a
};
@@ -119,11 +119,11 @@ static const u16 *const gUnknown_0860B1A4[] = {
Unknown_0860B192
};
static const u16 gUnknown_0860B1E4[] = {
static const u16 sUnknown_0860B1E4[] = {
0x0210, 0x0400, 0x0212, 0x1a26, 0x0208, 0x045d, 0x040a, 0x0411, 0x0464, 0x020e, 0x1a25, 0x181b, 0x1a24, 0x0420, 0x0410, 0x0400
};
static const u16 gUnknown_0860B204[] = {
static const u16 sUnknown_0860B204[] = {
0x007b, 0x007f, 0x0081, 0x0023, 0x0023, 0x0023, 0x00a5, 0x00a7, 0x00a6, 0x000b, 0x012f, 0x006b, 0x006d, 0x0044, 0x0044, 0x000c
};
@@ -176,7 +176,7 @@ static const u16 *const gUnknown_0860B2EC[] = {
Unknown_0860B2D6
};
static const u16 gUnknown_0860B304[] = {
static const u16 sUnknown_0860B304[] = {
0x0b, 0x6e, 0x40, 0x6f, 0x44, 0x47
};
@@ -218,7 +218,7 @@ static const u8 *const gUnknown_0860B338[] = {
gUnknown_085EADE7
};
static const u16 gUnknown_0860B34C[] = {
static const u16 sUnknown_0860B34C[] = {
0x0120, 0x013b, 0x011e, 0x013d, 0x0019
};
@@ -226,7 +226,7 @@ static EWRAM_DATA struct LilycoveLadyFavour *gUnknown_0203CD64 = NULL;
static EWRAM_DATA struct LilycoveLadyQuiz *gUnknown_0203CD68 = NULL;
static EWRAM_DATA struct LilycoveLadyContest *gUnknown_0203CD6C = NULL;
extern EWRAM_DATA u16 gScriptItemId;
extern EWRAM_DATA u16 gSpecialVar_ItemId;
u8 GetLilycoveLadyId(void)
{
@@ -237,16 +237,16 @@ void sub_818D9C0(void)
{
LilycoveLady *lilycoveLady;
VarSet(VAR_0x4010, gUnknown_0860B07E[GetLilycoveLadyId()]);
VarSet(VAR_0x4010, sUnknown_0860B07E[GetLilycoveLadyId()]);
if (GetLilycoveLadyId() == LILYCOVE_LADY_CONTEST)
{
lilycoveLady = &gSaveBlock1Ptr->lilycoveLady;
VarSet(VAR_0x4011, gUnknown_0860B074[lilycoveLady->contest.category]);
gScriptResult = TRUE;
VarSet(VAR_0x4011, sUnknown_0860B074[lilycoveLady->contest.category]);
gSpecialVar_Result = TRUE;
}
else
{
gScriptResult = FALSE;
gSpecialVar_Result = FALSE;
}
}
@@ -308,7 +308,7 @@ void SetLilycoveLadyRandomly(void)
void sub_818DAEC(void)
{
gScriptResult = GetLilycoveLadyId();
gSpecialVar_Result = GetLilycoveLadyId();
}
static u8 sub_818DB04(const u16 *data)
@@ -459,7 +459,7 @@ static bool8 sub_818DD84(u16 itemId)
bool8 sub_818DE44(void)
{
return sub_818DD84(gScriptItemId);
return sub_818DD84(gSpecialVar_ItemId);
}
bool8 sub_818DE5C(void)
@@ -481,7 +481,7 @@ u16 sub_818DEA0(void)
u16 itemId;
gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour;
itemId = gUnknown_0860B304[gUnknown_0203CD64->unk_00c];
itemId = sUnknown_0860B304[gUnknown_0203CD64->unk_00c];
sub_818DE88(itemId);
gUnknown_0203CD64->phase = 2;
return itemId;
@@ -508,8 +508,8 @@ static void sub_818DF00(void)
{
gUnknown_0203CD68->unk_002[i] = gUnknown_0860B1A4[v0][i];
}
gUnknown_0203CD68->unk_014 = gUnknown_0860B1E4[v0];
gUnknown_0203CD68->itemId = gUnknown_0860B204[v0];
gUnknown_0203CD68->unk_014 = sUnknown_0860B1E4[v0];
gUnknown_0203CD68->itemId = sUnknown_0860B204[v0];
gUnknown_0203CD68->unk_02b = v0;
gUnknown_0203CD68->playerName[0] = EOS;
}
@@ -581,13 +581,13 @@ u8 sub_818E06C(void)
{
i = 0;
}
} while (sub_811F8D8(gUnknown_0860B1E4[i]) == 0);
} while (sub_811F8D8(sUnknown_0860B1E4[i]) == 0);
for (j = 0; j < 9; j ++)
{
quiz->unk_002[j] = gUnknown_0860B1A4[i][j];
}
quiz->unk_014 = gUnknown_0860B1E4[i];
quiz->itemId = gUnknown_0860B204[i];
quiz->unk_014 = sUnknown_0860B1E4[i];
quiz->itemId = sUnknown_0860B204[i];
quiz->unk_02b = i;
quiz->playerName[0] = EOS;
}
@@ -845,7 +845,7 @@ void sub_818E47C(void)
void sub_818E490(void)
{
RemoveBagItem(gScriptItemId, 1);
RemoveBagItem(gSpecialVar_ItemId, 1);
}
void sub_818E4A4(void)
@@ -853,7 +853,7 @@ void sub_818E4A4(void)
u8 i;
gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz;
gUnknown_0203CD68->itemId = gScriptItemId;
gUnknown_0203CD68->itemId = gSpecialVar_ItemId;
for (i = 0; i < 4; i ++)
{
gUnknown_0203CD68->playerTrainerId[i] = gSaveBlock2Ptr->playerTrainerId[i];
@@ -943,7 +943,7 @@ static void sub_818E6B0(u8 sheen)
}
}
bool8 sub_818E704(struct Pokeblock *pokeblock)
bool8 GivePokeblockToContestLady(struct Pokeblock *pokeblock)
{
u8 sheen;
bool8 response;
@@ -1079,7 +1079,7 @@ void sub_818E914(void)
void sub_818E92C(void)
{
sub_81357FC(3, c2_exit_to_overworld_2_switch);
OpenPokeblockCase(3, c2_exit_to_overworld_2_switch);
}
void sub_818E940(void)
@@ -1091,7 +1091,7 @@ void sub_818E940(void)
void sub_818E960(void)
{
gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest;
gSpecialVar_0x8005 = gUnknown_0860B34C[gUnknown_0203CD6C->category];
gSpecialVar_0x8005 = sUnknown_0860B34C[gUnknown_0203CD6C->category];
}
u8 sub_818E990(void)
+208 -23
View File
@@ -3,19 +3,34 @@
#include "load_save.h"
#include "main.h"
#include "pokemon.h"
#include "rng.h"
#include "malloc.h"
#include "random.h"
extern void* gUnknown_0203CF5C;
extern bool16 IdentifyFlash(void);
extern void SetBagItemsPointers(void);
extern void SetDecorationInventoriesPointers(void);
extern void ApplyNewEncryptionKeyToGameStats(u32 key);
extern void ApplyNewEncryptionKeyToBagItems(u32 newKey);
extern void ApplyNewEncryptionKeyToBagItems_(u32 key);
extern void ApplyNewEncryptionKeyToBerryPowder(u32 key);
extern void sub_8084FAC(int unused);
void ApplyNewEncyprtionKeyToAllEncryptedData(u32 encryptionKey);
// this is probably wrong or misleading due to it being used in ResetHeap...
extern void InitHeap(void *pointer, u32 size);
#define SAVEBLOCK_MOVE_RANGE 128
struct LoadedSaveData
{
/*0x0000*/ struct ItemSlot items[30];
/*0x0078*/ struct ItemSlot keyItems[30];
/*0x00F0*/ struct ItemSlot pokeBalls[16];
/*0x0130*/ struct ItemSlot TMsHMs[64];
/*0x0230*/ struct ItemSlot berries[46];
/*0x02E8*/ struct MailStruct mail[MAIL_COUNT];
};
EWRAM_DATA struct SaveBlock2 gSaveblock2 = {0};
EWRAM_DATA u8 gSaveblock2_DMA[SAVEBLOCK_MOVE_RANGE] = {0};
@@ -25,6 +40,11 @@ EWRAM_DATA u8 gSaveblock1_DMA[SAVEBLOCK_MOVE_RANGE] = {0};
EWRAM_DATA struct PokemonStorage gPokemonStorage = {0};
EWRAM_DATA u8 gSaveblock3_DMA[SAVEBLOCK_MOVE_RANGE] = {0};
EWRAM_DATA struct LoadedSaveData gLoadedSaveData = {0};
EWRAM_DATA u32 gLastEncryptionKey = {0};
void ApplyNewEncryptionKeyToAllEncryptedData(u32 encryptionKey);
void CheckForFlashMemory(void)
{
if (!IdentifyFlash())
@@ -60,18 +80,15 @@ void SetSaveBlocksPointers(u16 offset)
SetDecorationInventoriesPointers();
}
struct SaveBlocksInOne
{
struct SaveBlock2 sav2;
struct SaveBlock1 sav1;
struct PokemonStorage sav3;
};
/*
extern u8 gHeap[];
void MoveSaveBlocks_ResetHeap(void)
{
void *vblankCB, *hblankCB;
u32 encryptionKey;
struct SaveBlocksInOne* copiedSavs;
struct SaveBlock2 *saveBlock2Copy;
struct SaveBlock1 *saveBlock1Copy;
struct PokemonStorage *pokemonStorageCopy;
// save interrupt functions and turn them off
vblankCB = gMain.vblankCallback;
@@ -80,24 +97,30 @@ void MoveSaveBlocks_ResetHeap(void)
gMain.hblankCallback = NULL;
gUnknown_0203CF5C = NULL;
copiedSavs = (void*)(gHeap);
saveBlock2Copy = (struct SaveBlock2 *)(gHeap);
saveBlock1Copy = (struct SaveBlock1 *)(gHeap + sizeof(struct SaveBlock2));
pokemonStorageCopy = (struct PokemonStorage *)(gHeap + sizeof(struct SaveBlock2) + sizeof(struct SaveBlock1));
// copy saveblocks' content
copiedSavs->sav2 = *gSaveBlock2Ptr;
copiedSavs->sav1 = *gSaveBlock1Ptr;
copiedSavs->sav3 = *gPokemonStoragePtr;
// backup the saves.
*saveBlock2Copy = *gSaveBlock2Ptr;
*saveBlock1Copy = *gSaveBlock1Ptr;
*pokemonStorageCopy = *gPokemonStoragePtr;
// change saveblocks' pointers
// argument is a sum of the individual trainerId bytes
SetSaveBlocksPointers(copiedSavs->sav2.playerTrainerId[0] + copiedSavs->sav2.playerTrainerId[1] + copiedSavs->sav2.playerTrainerId[2] + copiedSavs->sav2.playerTrainerId[3]);
SetSaveBlocksPointers(
saveBlock2Copy->playerTrainerId[0] +
saveBlock2Copy->playerTrainerId[1] +
saveBlock2Copy->playerTrainerId[2] +
saveBlock2Copy->playerTrainerId[3]);
// restore saveblock data since the pointers changed
*gSaveBlock2Ptr = copiedSavs->sav2;
*gSaveBlock1Ptr = copiedSavs->sav1;
*gPokemonStoragePtr = copiedSavs->sav3;
*gSaveBlock2Ptr = *saveBlock2Copy;
*gSaveBlock1Ptr = *saveBlock1Copy;
*gPokemonStoragePtr = *pokemonStorageCopy;
// heap was destroyed in the copying process, so reset it
InitHeap(gHeap, sizeof(gHeap));
InitHeap(gHeap, HEAP_SIZE);
// restore interrupt functions
gMain.hblankCallback = hblankCB;
@@ -105,6 +128,168 @@ void MoveSaveBlocks_ResetHeap(void)
// create a new encryption key
encryptionKey = (Random() << 0x10) + (Random());
ApplyNewEncyprtionKeyToAllEncryptedData(encryptionKey);
ApplyNewEncryptionKeyToAllEncryptedData(encryptionKey);
gSaveBlock2Ptr->encryptionKey = encryptionKey;
}*/
}
u8 sav2_x1_query_bit1(void)
{
return gSaveBlock2Ptr->specialSaveWarp & 1;
}
void sav2_x9_clear_bit1(void)
{
gSaveBlock2Ptr->specialSaveWarp &= ~1;
}
void sub_8076D48(void)
{
gSaveBlock2Ptr->specialSaveWarp |= 1;
}
void sub_8076D5C(void)
{
sub_8084FAC(0);
gSaveBlock2Ptr->specialSaveWarp |= 1;
}
void sav2_gender2_inplace_and_xFE(void)
{
gSaveBlock2Ptr->specialSaveWarp &= ~1;
}
void copy_player_party_to_sav1(void) // SavePlayerParty
{
int i;
gSaveBlock1Ptr->playerPartyCount = gPlayerPartyCount;
for (i = 0; i < 6; i++)
gSaveBlock1Ptr->playerParty[i] = gPlayerParty[i];
}
void copy_player_party_from_sav1(void) // LoadPlayerParty
{
int i;
gPlayerPartyCount = gSaveBlock1Ptr->playerPartyCount;
for (i = 0; i < 6; i++)
gPlayerParty[i] = gSaveBlock1Ptr->playerParty[i];
}
void save_serialize_npcs(void) // SaveMapObjects
{
int i;
for (i = 0; i < 16; i++)
gSaveBlock1Ptr->mapObjects[i] = gMapObjects[i];
}
void save_deserialize_npcs(void) // LoadMapObjects
{
int i;
for (i = 0; i < 16; i++)
gMapObjects[i] = gSaveBlock1Ptr->mapObjects[i];
}
void SaveSerializedGame(void)
{
copy_player_party_to_sav1();
save_serialize_npcs();
}
void LoadSerializedGame(void)
{
copy_player_party_from_sav1();
save_deserialize_npcs();
}
void copy_bags_and_unk_data_from_save_blocks(void)
{
int i;
// load player items.
for (i = 0; i < 30; i++)
gLoadedSaveData.items[i] = gSaveBlock1Ptr->bagPocket_Items[i];
// load player key items.
for (i = 0; i < 30; i++)
gLoadedSaveData.keyItems[i] = gSaveBlock1Ptr->bagPocket_KeyItems[i];
// load player pokeballs.
for (i = 0; i < 16; i++)
gLoadedSaveData.pokeBalls[i] = gSaveBlock1Ptr->bagPocket_PokeBalls[i];
// load player TMs and HMs.
for (i = 0; i < 64; i++)
gLoadedSaveData.TMsHMs[i] = gSaveBlock1Ptr->bagPocket_TMHM[i];
// load player berries.
for (i = 0; i < 46; i++)
gLoadedSaveData.berries[i] = gSaveBlock1Ptr->bagPocket_Berries[i];
// load mail.
for (i = 0; i < 16; i++)
gLoadedSaveData.mail[i] = gSaveBlock1Ptr->mail[i];
gLastEncryptionKey = gSaveBlock2Ptr->encryptionKey;
}
void copy_bags_and_unk_data_to_save_blocks(void)
{
int i;
u32 encryptionKeyBackup;
// save player items.
for (i = 0; i < 30; i++)
gSaveBlock1Ptr->bagPocket_Items[i] = gLoadedSaveData.items[i];
// save player key items.
for (i = 0; i < 30; i++)
gSaveBlock1Ptr->bagPocket_KeyItems[i] = gLoadedSaveData.keyItems[i];
// save player pokeballs.
for (i = 0; i < 16; i++)
gSaveBlock1Ptr->bagPocket_PokeBalls[i] = gLoadedSaveData.pokeBalls[i];
// save player TMs and HMs.
for (i = 0; i < 64; i++)
gSaveBlock1Ptr->bagPocket_TMHM[i] = gLoadedSaveData.TMsHMs[i];
// save player berries.
for (i = 0; i < 46; i++)
gSaveBlock1Ptr->bagPocket_Berries[i] = gLoadedSaveData.berries[i];
// save mail.
for (i = 0; i < 16; i++)
gSaveBlock1Ptr->mail[i] = gLoadedSaveData.mail[i];
encryptionKeyBackup = gSaveBlock2Ptr->encryptionKey;
gSaveBlock2Ptr->encryptionKey = gLastEncryptionKey;
ApplyNewEncryptionKeyToBagItems(encryptionKeyBackup);
gSaveBlock2Ptr->encryptionKey = encryptionKeyBackup; // updated twice?
}
void ApplyNewEncryptionKeyToHword(u16 *hWord, u32 newKey)
{
*hWord ^= gSaveBlock2Ptr->encryptionKey;
*hWord ^= newKey;
}
void ApplyNewEncryptionKeyToWord(u32 *word, u32 newKey)
{
*word ^= gSaveBlock2Ptr->encryptionKey;
*word ^= newKey;
}
void ApplyNewEncryptionKeyToAllEncryptedData(u32 encryptionKey)
{
ApplyNewEncryptionKeyToGameStats(encryptionKey);
ApplyNewEncryptionKeyToBagItems_(encryptionKey);
ApplyNewEncryptionKeyToBerryPowder(encryptionKey);
ApplyNewEncryptionKeyToWord(&gSaveBlock1Ptr->money, encryptionKey);
ApplyNewEncryptionKeyToHword(&gSaveBlock1Ptr->coins, encryptionKey);
}
+6 -6
View File
@@ -2,9 +2,9 @@
#include "lottery_corner.h"
#include "event_data.h"
#include "pokemon.h"
#include "items.h"
#include "rng.h"
#include "species.h"
#include "constants/items.h"
#include "random.h"
#include "constants/species.h"
#include "string_util.h"
#include "text.h"
@@ -42,7 +42,7 @@ void SetRandomLotteryNumber(u16 i)
void RetrieveLotteryNumber(void)
{
u16 lottoNumber = GetLotteryNumber();
gScriptResult = lottoNumber;
gSpecialVar_Result = lottoNumber;
}
void PickLotteryCornerTicket(void)
@@ -66,7 +66,7 @@ void PickLotteryCornerTicket(void)
if (!GetMonData(pkmn, MON_DATA_IS_EGG))
{
u32 otId = GetMonData(pkmn, MON_DATA_OT_ID);
u8 numMatchingDigits = GetMatchingDigits(gScriptResult, otId);
u8 numMatchingDigits = GetMatchingDigits(gSpecialVar_Result, otId);
if (numMatchingDigits > gSpecialVar_0x8004 && numMatchingDigits > 1)
{
@@ -90,7 +90,7 @@ void PickLotteryCornerTicket(void)
!GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_IS_EGG))
{
u32 otId = GetBoxMonData(&gPokemonStoragePtr->boxes[i][j], MON_DATA_OT_ID);
u8 numMatchingDigits = GetMatchingDigits(gScriptResult, otId);
u8 numMatchingDigits = GetMatchingDigits(gSpecialVar_Result, otId);
if (numMatchingDigits > gSpecialVar_0x8004 && numMatchingDigits > 1)
{
+4 -4
View File
@@ -11,10 +11,10 @@ void *gMPlayJumpTable[36];
struct CgbChannel gCgbChans[4];
struct MusicPlayerTrack gPokemonCryTracks[MAX_POKEMON_CRIES * 2];
struct PokemonCrySong gPokemonCrySong;
struct MusicPlayerInfo gMPlay_BGM;
struct MusicPlayerInfo gMPlay_SE1;
struct MusicPlayerInfo gMPlay_SE2;
struct MusicPlayerInfo gMPlay_SE3;
struct MusicPlayerInfo gMPlayInfo_BGM;
struct MusicPlayerInfo gMPlayInfo_SE1;
struct MusicPlayerInfo gMPlayInfo_SE2;
struct MusicPlayerInfo gMPlayInfo_SE3;
u8 gMPlayMemAccArea[0x10];
u32 MidiKeyToFreq(struct WaveData *wav, u8 key, u8 fineAdjust)
+2 -2
View File
@@ -45,7 +45,7 @@ void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16
mplayInfo->ident = ID_NUMBER;
}
void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 pitch)
void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 pitch)
{
s32 i;
u32 bit;
@@ -66,7 +66,7 @@ void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16
{
if (track->flags & MPT_FLG_EXIST)
{
track->keyShiftX = (s16)pitch >> 8;
track->keyShiftX = pitch >> 8;
track->pitX = pitch;
track->flags |= MPT_FLG_PITCHG;
}
+165 -188
View File
@@ -1,14 +1,14 @@
// Includes
#include "global.h"
#include "mail.h"
#include "constants/items.h"
#include "main.h"
#include "overworld.h"
#include "task.h"
#include "unknown_task.h"
#include "scanline_effect.h"
#include "palette.h"
#include "text.h"
#include "menu.h"
#include "menu_helpers.h"
#include "text.h"
#include "text_window.h"
#include "string_util.h"
#include "international_string_util.h"
@@ -16,11 +16,46 @@
#include "gpu_regs.h"
#include "bg.h"
#include "pokemon_icon.h"
#include "species.h"
#include "constants/species.h"
#include "malloc.h"
#include "easy_chat.h"
#include "mail_data.h"
#include "mail.h"
extern const u16 gMailPalette_Orange[];
extern const u16 gMailPalette_Harbor[];
extern const u16 gMailPalette_Glitter[];
extern const u16 gMailPalette_Mech[];
extern const u16 gMailPalette_Wood[];
extern const u16 gMailPalette_Wave[];
extern const u16 gMailPalette_Bead[];
extern const u16 gMailPalette_Shadow[];
extern const u16 gMailPalette_Tropic[];
extern const u16 gMailPalette_Dream[];
extern const u16 gMailPalette_Fab[];
extern const u16 gMailPalette_Retro[];
extern const u8 gMailTiles_Orange[];
extern const u8 gMailTilemap_Orange[];
extern const u8 gMailTiles_Harbor[];
extern const u8 gMailTilemap_Harbor[];
extern const u8 gMailTiles_Glitter[];
extern const u8 gMailTilemap_Glitter[];
extern const u8 gMailTiles_Mech[];
extern const u8 gMailTilemap_Mech[];
extern const u8 gMailTiles_Wood[];
extern const u8 gMailTilemap_Wood[];
extern const u8 gMailTiles_Wave[];
extern const u8 gMailTilemap_Wave[];
extern const u8 gMailTiles_Bead[];
extern const u8 gMailTilemap_Bead[];
extern const u8 gMailTiles_Shadow[];
extern const u8 gMailTilemap_Shadow[];
extern const u8 gMailTiles_Tropic[];
extern const u8 gMailTilemap_Tropic[];
extern const u8 gMailTiles_Dream[];
extern const u8 gMailTilemap_Dream[];
extern const u8 gMailTiles_Fab[];
extern const u8 gMailTilemap_Fab[];
extern const u8 gMailTiles_Retro[];
extern const u8 gMailTilemap_Retro[];
// Static type declarations
@@ -52,9 +87,7 @@ struct MailGraphics
u16 color12;
};
// Static RAM declarations
static EWRAM_DATA struct
struct MailRead
{
/*0x0000*/ u8 strbuf[8][64];
/*0x0200*/ u8 playerName[12];
@@ -73,22 +106,26 @@ static EWRAM_DATA struct
/*0x0228*/ const struct MailLayout *layout;
/*0x022c*/ u8 bg1TilemapBuffer[0x1000];
/*0x122c*/ u8 bg2TilemapBuffer[0x1000];
} *gUnknown_0203A134 = NULL;
};
// Static RAM declarations
static EWRAM_DATA struct MailRead *sMailRead = NULL;
// Static ROM declarations
void sub_81219F0(void);
void sub_8121A1C(void);
void sub_8121B1C(void);
void sub_8121C50(void);
void sub_8121C64(void);
void sub_8121C98(void);
void sub_8121CC0(void);
void sub_8121D00(void);
static void CB2_InitMailRead(void);
static void sub_8121A1C(void);
static void sub_8121B1C(void);
static void VBlankCB_MailRead(void);
static void CB2_MailRead(void);
static void CB2_WaitForPaletteExitOnKeyPress(void);
static void CB2_ExitOnKeyPress(void);
static void CB2_ExitMailReadFreeVars(void);
// .rodata
const struct BgTemplate gUnknown_0859F290[] = {
static const struct BgTemplate sUnknown_0859F290[] = {
{
.bg = 0,
.charBaseIndex = 2,
@@ -107,7 +144,7 @@ const struct BgTemplate gUnknown_0859F290[] = {
}
};
const struct WindowTemplate gUnknown_0859F29C[] = {
static const struct WindowTemplate sUnknown_0859F29C[] = {
{
.priority = 0,
.tilemapLeft = 2,
@@ -120,89 +157,52 @@ const struct WindowTemplate gUnknown_0859F29C[] = {
DUMMY_WIN_TEMPLATE
};
const u8 gUnknown_0859F2AC[] = {
static const u8 sUnknown_0859F2AC[] = {
0,
10,
11
};
const u16 gUnknown_0859F2B0[][2] = {
static const u16 sUnknown_0859F2B0[][2] = {
{ 0x6ACD, 0x51A5 },
{ 0x45FC, 0x38D4 }
};
extern const u16 gUnknown_08DBE818[];
extern const u16 gUnknown_08DBE838[];
extern const u16 gUnknown_08DBE858[];
extern const u16 gUnknown_08DBE878[];
extern const u16 gUnknown_08DBE898[];
extern const u16 gUnknown_08DBE8B8[];
extern const u16 gUnknown_08DBE8D8[];
extern const u16 gUnknown_08DBE8F8[];
extern const u16 gUnknown_08DBE918[];
extern const u16 gUnknown_08DBE938[];
extern const u16 gUnknown_08DBE958[];
extern const u16 gUnknown_08DBE978[];
extern const u8 gUnknown_08DBE998[];
extern const u8 gUnknown_08DBFBA4[];
extern const u8 gUnknown_08DBEB38[];
extern const u8 gUnknown_08DBFC7C[];
extern const u8 gUnknown_08DBEC74[];
extern const u8 gUnknown_08DBFD5C[];
extern const u8 gUnknown_08DBEE84[];
extern const u8 gUnknown_08DBFE68[];
extern const u8 gUnknown_08DBEF5C[];
extern const u8 gUnknown_08DBFF44[];
extern const u8 gUnknown_08DBF154[];
extern const u8 gUnknown_08DC0034[];
extern const u8 gUnknown_08DBF2D4[];
extern const u8 gUnknown_08DC0114[];
extern const u8 gUnknown_08DBF37C[];
extern const u8 gUnknown_08DC01F4[];
extern const u8 gUnknown_08DBF50C[];
extern const u8 gUnknown_08DC0300[];
extern const u8 gUnknown_08DBF64C[];
extern const u8 gUnknown_08DC03F0[];
extern const u8 gUnknown_08DBF7B4[];
extern const u8 gUnknown_08DC04E8[];
extern const u8 gUnknown_08DBF904[];
extern const u8 gUnknown_08DC0600[];
const struct MailGraphics gUnknown_0859F2B8[] = {
static const struct MailGraphics sUnknown_0859F2B8[] = {
{
gUnknown_08DBE818, gUnknown_08DBE998, gUnknown_08DBFBA4, 0x02c0, 0x0000, 0x294a, 0x6739
gMailPalette_Orange, gMailTiles_Orange, gMailTilemap_Orange, 0x02c0, 0x0000, 0x294a, 0x6739
}, {
gUnknown_08DBE838, gUnknown_08DBEB38, gUnknown_08DBFC7C, 0x02e0, 0x0000, 0x7fff, 0x4631
gMailPalette_Harbor, gMailTiles_Harbor, gMailTilemap_Harbor, 0x02e0, 0x0000, 0x7fff, 0x4631
}, {
gUnknown_08DBE858, gUnknown_08DBEC74, gUnknown_08DBFD5C, 0x0400, 0x0000, 0x294a, 0x6739
gMailPalette_Glitter, gMailTiles_Glitter, gMailTilemap_Glitter, 0x0400, 0x0000, 0x294a, 0x6739
}, {
gUnknown_08DBE878, gUnknown_08DBEE84, gUnknown_08DBFE68, 0x01e0, 0x0000, 0x7fff, 0x4631
gMailPalette_Mech, gMailTiles_Mech, gMailTilemap_Mech, 0x01e0, 0x0000, 0x7fff, 0x4631
}, {
gUnknown_08DBE898, gUnknown_08DBEF5C, gUnknown_08DBFF44, 0x02e0, 0x0000, 0x7fff, 0x4631
gMailPalette_Wood, gMailTiles_Wood, gMailTilemap_Wood, 0x02e0, 0x0000, 0x7fff, 0x4631
}, {
gUnknown_08DBE8B8, gUnknown_08DBF154, gUnknown_08DC0034, 0x0300, 0x0000, 0x294a, 0x6739
gMailPalette_Wave, gMailTiles_Wave, gMailTilemap_Wave, 0x0300, 0x0000, 0x294a, 0x6739
}, {
gUnknown_08DBE8D8, gUnknown_08DBF2D4, gUnknown_08DC0114, 0x0140, 0x0000, 0x7fff, 0x4631
gMailPalette_Bead, gMailTiles_Bead, gMailTilemap_Bead, 0x0140, 0x0000, 0x7fff, 0x4631
}, {
gUnknown_08DBE8F8, gUnknown_08DBF37C, gUnknown_08DC01F4, 0x0300, 0x0000, 0x7fff, 0x4631
gMailPalette_Shadow, gMailTiles_Shadow, gMailTilemap_Shadow, 0x0300, 0x0000, 0x7fff, 0x4631
}, {
gUnknown_08DBE918, gUnknown_08DBF50C, gUnknown_08DC0300, 0x0220, 0x0000, 0x294a, 0x6739
gMailPalette_Tropic, gMailTiles_Tropic, gMailTilemap_Tropic, 0x0220, 0x0000, 0x294a, 0x6739
}, {
gUnknown_08DBE938, gUnknown_08DBF64C, gUnknown_08DC03F0, 0x0340, 0x0000, 0x294a, 0x6739
gMailPalette_Dream, gMailTiles_Dream, gMailTilemap_Dream, 0x0340, 0x0000, 0x294a, 0x6739
}, {
gUnknown_08DBE958, gUnknown_08DBF7B4, gUnknown_08DC04E8, 0x02a0, 0x0000, 0x294a, 0x6739
gMailPalette_Fab, gMailTiles_Fab, gMailTilemap_Fab, 0x02a0, 0x0000, 0x294a, 0x6739
}, {
gUnknown_08DBE978, gUnknown_08DBF904, gUnknown_08DC0600, 0x0520, 0x0000, 0x294a, 0x6739
gMailPalette_Retro, gMailTiles_Retro, gMailTilemap_Retro, 0x0520, 0x0000, 0x294a, 0x6739
}
};
const struct UnkMailStruct Unknown_0859F3A8[] = {
static const struct UnkMailStruct Unknown_0859F3A8[] = {
{ .numEasyChatWords = 3, .lineHeight = 16 },
{ .numEasyChatWords = 3, .lineHeight = 16 },
{ .numEasyChatWords = 3, .lineHeight = 16 }
};
const struct MailLayout gUnknown_0859F3B4[] = {
static const struct MailLayout sUnknown_0859F3B4[] = {
{ 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 },
{ 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 },
{ 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 },
@@ -217,7 +217,7 @@ const struct MailLayout gUnknown_0859F3B4[] = {
{ 0x03, 0x00, 0x00, 0x02, 0x00, Unknown_0859F3A8 }
};
const struct UnkMailStruct Unknown_0859F444[] = {
static const struct UnkMailStruct Unknown_0859F444[] = {
{ .numEasyChatWords = 2, .lineHeight = 16 },
{ .numEasyChatWords = 2, .lineHeight = 16 },
{ .numEasyChatWords = 2, .lineHeight = 16 },
@@ -225,7 +225,7 @@ const struct UnkMailStruct Unknown_0859F444[] = {
{ .numEasyChatWords = 1, .lineHeight = 16 }
};
const struct MailLayout gUnknown_0859F458[] = {
static const struct MailLayout sUnknown_0859F458[] = {
{ 0x05, 0x07, 0x58, 0x0b, 0x1e, Unknown_0859F444 },
{ 0x05, 0x0a, 0x60, 0x09, 0x1e, Unknown_0859F444 },
{ 0x05, 0x0c, 0x68, 0x05, 0x1e, Unknown_0859F444 },
@@ -240,86 +240,64 @@ const struct MailLayout gUnknown_0859F458[] = {
{ 0x05, 0x09, 0x60, 0x05, 0x1e, Unknown_0859F444 }
};
// What the heck are these meant to be? Call them u16 for now.
const u16 Unknown_0859F4E8[] = {
0x00, 0x4000, 0x00, 0x00
};
const u16 Unknown_0859F4F0[] = {
0x00, 0x00, -1, 0x00
};
const u16 Unknown_0859F4F8[] = {
0x04, 0x00, -1, 0x00
};
const u16 Unknown_0859F500[] = {
0x00, 0x40, -1, 0x00
};
const u16 *const gUnknown_0859F508[] = {
Unknown_0859F4F0,
Unknown_0859F4F8,
Unknown_0859F500
};
// .text
void sub_8121478(struct MailStruct *mail, MainCallback callback, bool8 flag) {
void ReadMail(struct MailStruct *mail, void (*callback)(void), bool8 flag)
{
u16 buffer[2];
u16 species;
gUnknown_0203A134 = calloc(1, sizeof(*gUnknown_0203A134));
gUnknown_0203A134->language = LANGUAGE_ENGLISH;
gUnknown_0203A134->playerIsSender = TRUE;
gUnknown_0203A134->parserSingle = CopyEasyChatWord;
gUnknown_0203A134->parserMultiple = ConvertEasyChatWordsToString;
if (mail->itemId >= ITEM_ORANGE_MAIL && mail->itemId <= ITEM_RETRO_MAIL) {
gUnknown_0203A134->mailType = mail->itemId - ITEM_ORANGE_MAIL;
sMailRead = calloc(1, sizeof(*sMailRead));
sMailRead->language = LANGUAGE_ENGLISH;
sMailRead->playerIsSender = TRUE;
sMailRead->parserSingle = CopyEasyChatWord;
sMailRead->parserMultiple = ConvertEasyChatWordsToString;
if (IS_ITEM_MAIL(mail->itemId))
{
sMailRead->mailType = mail->itemId - ITEM_ORANGE_MAIL;
}
else
{
gUnknown_0203A134->mailType = 0;
sMailRead->mailType = 0;
flag = FALSE;
}
switch (gUnknown_0203A134->playerIsSender)
switch (sMailRead->playerIsSender)
{
case FALSE:
default:
gUnknown_0203A134->layout = &gUnknown_0859F3B4[gUnknown_0203A134->mailType];
sMailRead->layout = &sUnknown_0859F3B4[sMailRead->mailType];
break;
case TRUE:
gUnknown_0203A134->layout = &gUnknown_0859F458[gUnknown_0203A134->mailType];
sMailRead->layout = &sUnknown_0859F458[sMailRead->mailType];
break;
}
species = sub_80D45E8(mail->species, buffer);
species = MailSpeciesToSpecies(mail->species, buffer);
if (species >= SPECIES_BULBASAUR && species < NUM_SPECIES)
{
switch (gUnknown_0203A134->mailType)
switch (sMailRead->mailType)
{
default:
gUnknown_0203A134->animsActive = 0;
sMailRead->animsActive = 0;
break;
case ITEM_BEAD_MAIL - ITEM_ORANGE_MAIL:
gUnknown_0203A134->animsActive = 1;
sMailRead->animsActive = 1;
break;
case ITEM_DREAM_MAIL - ITEM_ORANGE_MAIL:
gUnknown_0203A134->animsActive = 2;
sMailRead->animsActive = 2;
break;
}
}
else
{
gUnknown_0203A134->animsActive = 0;
sMailRead->animsActive = 0;
}
gUnknown_0203A134->mail = mail;
gUnknown_0203A134->callback = callback;
gUnknown_0203A134->flag = flag;
SetMainCallback2(sub_81219F0);
sMailRead->mail = mail;
sMailRead->callback = callback;
sMailRead->flag = flag;
SetMainCallback2(CB2_InitMailRead);
}
bool8 sub_81215EC(void)
static bool8 MailReadBuildGraphics(void)
{
u16 icon;
@@ -327,7 +305,7 @@ bool8 sub_81215EC(void)
{
case 0:
SetVBlankCallback(NULL);
remove_some_task();
ScanlineEffect_Stop();
SetGpuReg(REG_OFFSET_DISPCNT, 0x0000);
break;
case 1:
@@ -353,21 +331,21 @@ bool8 sub_81215EC(void)
SetGpuReg(REG_OFFSET_BG2HOFS, 0x0000);
SetGpuReg(REG_OFFSET_BG3HOFS, 0x0000);
SetGpuReg(REG_OFFSET_BG3VOFS, 0x0000);
SetGpuReg(REG_OFFSET_BLDCNT, 0x0000);
SetGpuReg(REG_OFFSET_BLDCNT, 0x0000);
SetGpuReg(REG_OFFSET_BLDALPHA, 0x0000);
break;
case 6:
ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(0, gUnknown_0859F290, 3);
SetBgTilemapBuffer(1, gUnknown_0203A134->bg1TilemapBuffer);
SetBgTilemapBuffer(2, gUnknown_0203A134->bg2TilemapBuffer);
InitBgsFromTemplates(0, sUnknown_0859F290, 3);
SetBgTilemapBuffer(1, sMailRead->bg1TilemapBuffer);
SetBgTilemapBuffer(2, sMailRead->bg2TilemapBuffer);
break;
case 7:
InitWindows(gUnknown_0859F29C);
InitWindows(sUnknown_0859F29C);
DeactivateAllTextPrinters();
break;
case 8:
decompress_and_copy_tile_data_to_vram(1, gUnknown_0859F2B8[gUnknown_0203A134->mailType].tiles, 0, 0, 0);
decompress_and_copy_tile_data_to_vram(1, sUnknown_0859F2B8[sMailRead->mailType].tiles, 0, 0, 0);
break;
case 9:
if (free_temp_tile_data_buffers_if_possible())
@@ -378,7 +356,7 @@ bool8 sub_81215EC(void)
case 10:
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20);
FillBgTilemapBufferRect_Palette0(2, 1, 0, 0, 30, 20);
CopyToBgTilemapBuffer(1, gUnknown_0859F2B8[gUnknown_0203A134->mailType].tileMap, 0, 0);
CopyToBgTilemapBuffer(1, sUnknown_0859F2B8[sMailRead->mailType].tileMap, 0, 0);
break;
case 11:
CopyBgTilemapBufferToVram(0);
@@ -386,25 +364,25 @@ bool8 sub_81215EC(void)
CopyBgTilemapBufferToVram(2);
break;
case 12:
LoadPalette(sub_8098C64(), 240, 32);
gPlttBufferUnfaded[250] = gUnknown_0859F2B8[gUnknown_0203A134->mailType].color10;
gPlttBufferFaded[250] = gUnknown_0859F2B8[gUnknown_0203A134->mailType].color10;
gPlttBufferUnfaded[251] = gUnknown_0859F2B8[gUnknown_0203A134->mailType].color12;
gPlttBufferFaded[251] = gUnknown_0859F2B8[gUnknown_0203A134->mailType].color12;
LoadPalette(gUnknown_0859F2B8[gUnknown_0203A134->mailType].palette, 0, 32);
gPlttBufferUnfaded[10] = gUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][0];
gPlttBufferFaded[10] = gUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][0];
gPlttBufferUnfaded[11] = gUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][1];
gPlttBufferFaded[11] = gUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][1];
LoadPalette(GetOverworldTextboxPalettePtr(), 240, 32);
gPlttBufferUnfaded[250] = sUnknown_0859F2B8[sMailRead->mailType].color10;
gPlttBufferFaded[250] = sUnknown_0859F2B8[sMailRead->mailType].color10;
gPlttBufferUnfaded[251] = sUnknown_0859F2B8[sMailRead->mailType].color12;
gPlttBufferFaded[251] = sUnknown_0859F2B8[sMailRead->mailType].color12;
LoadPalette(sUnknown_0859F2B8[sMailRead->mailType].palette, 0, 32);
gPlttBufferUnfaded[10] = sUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][0];
gPlttBufferFaded[10] = sUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][0];
gPlttBufferUnfaded[11] = sUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][1];
gPlttBufferFaded[11] = sUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][1];
break;
case 13:
if (gUnknown_0203A134->flag)
if (sMailRead->flag)
{
sub_8121A1C();
}
break;
case 14:
if (gUnknown_0203A134->flag)
if (sMailRead->flag)
{
sub_8121B1C();
RunTextPrinters();
@@ -417,20 +395,20 @@ bool8 sub_81215EC(void)
}
break;
case 16:
SetVBlankCallback(sub_8121C50);
SetVBlankCallback(VBlankCB_MailRead);
gPaletteFade.bufferTransferDisabled = TRUE;
break;
case 17:
icon = sub_80D2E84(gUnknown_0203A134->mail->species);
switch (gUnknown_0203A134->animsActive)
icon = sub_80D2E84(sMailRead->mail->species);
switch (sMailRead->animsActive)
{
case 1:
sub_80D2F68(icon);
gUnknown_0203A134->monIconSprite = sub_80D2D78(icon, SpriteCallbackDummy, 0x60, 0x80, 0, 0);
sMailRead->monIconSprite = sub_80D2D78(icon, SpriteCallbackDummy, 0x60, 0x80, 0, 0);
break;
case 2:
sub_80D2F68(icon);
gUnknown_0203A134->monIconSprite = sub_80D2D78(icon, SpriteCallbackDummy, 0x28, 0x80, 0, 0);
sMailRead->monIconSprite = sub_80D2D78(icon, SpriteCallbackDummy, 0x28, 0x80, 0, 0);
break;
}
break;
@@ -441,53 +419,53 @@ bool8 sub_81215EC(void)
ShowBg(2);
BeginNormalPaletteFade(-1, 0, 16, 0, 0);
gPaletteFade.bufferTransferDisabled = FALSE;
gUnknown_0203A134->callback2 = sub_8121C98;
sMailRead->callback2 = CB2_WaitForPaletteExitOnKeyPress;
return TRUE;
default:
return FALSE;
}
gMain.state ++;
gMain.state++;
return FALSE;
}
void sub_81219F0(void)
static void CB2_InitMailRead(void)
{
do
{
if (sub_81215EC() == TRUE)
if (MailReadBuildGraphics() == TRUE)
{
SetMainCallback2(sub_8121C64);
SetMainCallback2(CB2_MailRead);
break;
}
} while (sub_81221AC() != TRUE);
}
void sub_8121A1C(void)
static void sub_8121A1C(void)
{
u16 i;
u8 total;
u8 *ptr;
total = 0;
for (i = 0; i < gUnknown_0203A134->layout->numSubStructs; i ++)
for (i = 0; i < sMailRead->layout->numSubStructs; i ++)
{
ConvertEasyChatWordsToString(gUnknown_0203A134->strbuf[i], &gUnknown_0203A134->mail->words[total], gUnknown_0203A134->layout->var8[i].numEasyChatWords, 1);
total += gUnknown_0203A134->layout->var8[i].numEasyChatWords;
ConvertEasyChatWordsToString(sMailRead->strbuf[i], &sMailRead->mail->words[total], sMailRead->layout->var8[i].numEasyChatWords, 1);
total += sMailRead->layout->var8[i].numEasyChatWords;
}
ptr = StringCopy(gUnknown_0203A134->playerName, gUnknown_0203A134->mail->playerName);
if (!gUnknown_0203A134->playerIsSender)
ptr = StringCopy(sMailRead->playerName, sMailRead->mail->playerName);
if (!sMailRead->playerIsSender)
{
StringCopy(ptr, gText_FromSpace);
gUnknown_0203A134->signatureWidth = gUnknown_0203A134->layout->signatureWidth - (StringLength(gUnknown_0203A134->playerName) * 8 - 0x60);
sMailRead->signatureWidth = sMailRead->layout->signatureWidth - (StringLength(sMailRead->playerName) * 8 - 0x60);
}
else
{
sub_81DB52C(gUnknown_0203A134->playerName);
gUnknown_0203A134->signatureWidth = gUnknown_0203A134->layout->signatureWidth;
sub_81DB52C(sMailRead->playerName);
sMailRead->signatureWidth = sMailRead->layout->signatureWidth;
}
}
void sub_8121B1C(void)
static void sub_8121B1C(void)
{
u16 i;
u8 strbuf[0x20];
@@ -501,77 +479,76 @@ void sub_8121B1C(void)
PutWindowTilemap(1);
FillWindowPixelBuffer(0, 0);
FillWindowPixelBuffer(1, 0);
for (i = 0; i < gUnknown_0203A134->layout->numSubStructs; i ++)
for (i = 0; i < sMailRead->layout->numSubStructs; i ++)
{
if (gUnknown_0203A134->strbuf[i][0] == EOS || gUnknown_0203A134->strbuf[i][0] == CHAR_SPACE)
if (sMailRead->strbuf[i][0] == EOS || sMailRead->strbuf[i][0] == CHAR_SPACE)
{
continue;
}
box_print(0, 1, gUnknown_0203A134->layout->var8[i].xOffset + gUnknown_0203A134->layout->wordsYPos, y + gUnknown_0203A134->layout->wordsXPos, gUnknown_0859F2AC, 0, gUnknown_0203A134->strbuf[i]);
y += gUnknown_0203A134->layout->var8[i].lineHeight;
box_print(0, 1, sMailRead->layout->var8[i].xOffset + sMailRead->layout->wordsYPos, y + sMailRead->layout->wordsXPos, sUnknown_0859F2AC, 0, sMailRead->strbuf[i]);
y += sMailRead->layout->var8[i].lineHeight;
}
bufptr = StringCopy(strbuf, gText_FromSpace);
StringCopy(bufptr, gUnknown_0203A134->playerName);
box_x = GetStringCenterAlignXOffset(1, strbuf, gUnknown_0203A134->signatureWidth) + 0x68;
box_y = gUnknown_0203A134->layout->signatureYPos + 0x58;
box_print(0, 1, box_x, box_y, gUnknown_0859F2AC, 0, strbuf);
StringCopy(bufptr, sMailRead->playerName);
box_x = GetStringCenterAlignXOffset(1, strbuf, sMailRead->signatureWidth) + 0x68;
box_y = sMailRead->layout->signatureYPos + 0x58;
box_print(0, 1, box_x, box_y, sUnknown_0859F2AC, 0, strbuf);
CopyWindowToVram(0, 3);
CopyWindowToVram(1, 3);
}
void sub_8121C50(void)
static void VBlankCB_MailRead(void)
{
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
}
void sub_8121C64(void)
static void CB2_MailRead(void)
{
if (gUnknown_0203A134->animsActive != 0)
if (sMailRead->animsActive != 0)
{
AnimateSprites();
BuildOamBuffer();
}
gUnknown_0203A134->callback2();
sMailRead->callback2();
}
void sub_8121C98(void)
static void CB2_WaitForPaletteExitOnKeyPress(void)
{
if (!UpdatePaletteFade())
{
gUnknown_0203A134->callback2 = sub_8121CC0;
sMailRead->callback2 = CB2_ExitOnKeyPress;
}
}
void sub_8121CC0(void)
static void CB2_ExitOnKeyPress(void)
{
if (gMain.newKeys & (A_BUTTON | B_BUTTON))
{
BeginNormalPaletteFade(-1, 0, 0, 16, 0);
gUnknown_0203A134->callback2 = sub_8121D00;
sMailRead->callback2 = CB2_ExitMailReadFreeVars;
}
}
void sub_8121D00(void)
static void CB2_ExitMailReadFreeVars(void)
{
if (!UpdatePaletteFade())
{
SetMainCallback2(gUnknown_0203A134->callback);
switch (gUnknown_0203A134->animsActive)
SetMainCallback2(sMailRead->callback);
switch (sMailRead->animsActive)
{
case 1:
case 2:
sub_80D2FF0(sub_80D2E84(gUnknown_0203A134->mail->species));
sub_80D2EF8(&gSprites[gUnknown_0203A134->monIconSprite]);
sub_80D2FF0(sub_80D2E84(sMailRead->mail->species));
sub_80D2EF8(&gSprites[sMailRead->monIconSprite]);
}
memset(gUnknown_0203A134, 0, sizeof(*gUnknown_0203A134));
memset(sMailRead, 0, sizeof(*sMailRead));
ResetPaletteFade();
UnsetBgTilemapBuffer(0);
UnsetBgTilemapBuffer(1);
ResetBgsAndClearDma3BusyFlags(0);
FreeAllWindowBuffers();
free(gUnknown_0203A134);
gUnknown_0203A134 = NULL;
FREE_AND_SET_NULL(sMailRead);
}
}
+203
View File
@@ -0,0 +1,203 @@
#include "global.h"
#include "mail.h"
#include "constants/items.h"
#include "pokemon.h"
#include "pokemon_icon.h"
#include "constants/species.h"
#include "text.h"
#include "international_string_util.h"
void ClearMailData(void)
{
u8 i;
for (i = 0; i < MAIL_COUNT; i++)
ClearMailStruct(&gSaveBlock1Ptr->mail[i]);
}
void ClearMailStruct(struct MailStruct *mail)
{
s32 i;
for (i = 0; i < MAIL_WORDS_COUNT; i++)
mail->words[i] = 0xFFFF;
for (i = 0; i < PLAYER_NAME_LENGTH; i++)
mail->playerName[i] = EOS;
for (i = 0; i < 4; i++)
mail->trainerId[i] = 0;
mail->species = SPECIES_BULBASAUR;
mail->itemId = ITEM_NONE;
}
bool8 MonHasMail(struct Pokemon *mon)
{
u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM);
if (ItemIsMail(heldItem) && GetMonData(mon, MON_DATA_MAIL) != 0xFF)
return TRUE;
else
return FALSE;
}
u8 GiveMailToMon(struct Pokemon *mon, u16 itemId)
{
u8 heldItem[2];
u8 id, i;
u16 species;
u32 personality;
heldItem[0] = itemId;
heldItem[1] = itemId >> 8;
for (id = 0; id < PARTY_SIZE; id++)
{
if (gSaveBlock1Ptr->mail[id].itemId == 0)
{
for (i = 0; i < MAIL_WORDS_COUNT; i++)
gSaveBlock1Ptr->mail[id].words[i] = 0xFFFF;
for (i = 0; i < PLAYER_NAME_LENGTH - 1; i++)
gSaveBlock1Ptr->mail[id].playerName[i] = gSaveBlock2Ptr->playerName[i];
gSaveBlock1Ptr->mail[id].playerName[i] = EOS;
PadNameString(gSaveBlock1Ptr->mail[id].playerName, CHAR_SPACE);
for (i = 0; i < 4; i++)
gSaveBlock1Ptr->mail[id].trainerId[i] = gSaveBlock2Ptr->playerTrainerId[i];
species = GetBoxMonData(&mon->box, MON_DATA_SPECIES);
personality = GetBoxMonData(&mon->box, MON_DATA_PERSONALITY);
gSaveBlock1Ptr->mail[id].species = SpeciesToMailSpecies(species, personality);
gSaveBlock1Ptr->mail[id].itemId = itemId;
SetMonData(mon, MON_DATA_MAIL, &id);
SetMonData(mon, MON_DATA_HELD_ITEM, heldItem);
return id;
}
}
return 0xFF;
}
u16 SpeciesToMailSpecies(u16 species, u32 personality)
{
if (species == SPECIES_UNOWN)
{
u32 species = GetUnownLetterByPersonality(personality) + 30000;
return species;
}
return species;
}
u16 MailSpeciesToSpecies(u16 mailSpecies, u16 *buffer)
{
u16 result;
if (mailSpecies >= 30000 && mailSpecies < (30000 + UNOWN_FORM_COUNT))
{
result = SPECIES_UNOWN;
*buffer = mailSpecies - 30000;
}
else
{
result = mailSpecies;
}
return result;
}
u8 GiveMailToMon2(struct Pokemon *mon, struct MailStruct *mail)
{
u8 heldItem[2];
u16 itemId = mail->itemId;
u8 mailId = GiveMailToMon(mon, itemId);
if (mailId == 0xFF)
return 0xFF;
gSaveBlock1Ptr->mail[mailId] = *mail;
SetMonData(mon, MON_DATA_MAIL, &mailId);
heldItem[0] = itemId;
heldItem[1] = itemId >> 8;
SetMonData(mon, MON_DATA_HELD_ITEM, heldItem);
return mailId;
}
static bool32 DummyMailFunc(void)
{
return FALSE;
}
void TakeMailFromMon(struct Pokemon *mon)
{
u8 heldItem[2];
u8 mailId;
if (MonHasMail(mon))
{
mailId = GetMonData(mon, MON_DATA_MAIL);
gSaveBlock1Ptr->mail[mailId].itemId = ITEM_NONE;
mailId = 0xFF;
heldItem[0] = ITEM_NONE;
heldItem[1] = ITEM_NONE << 8;
SetMonData(mon, MON_DATA_MAIL, &mailId);
SetMonData(mon, MON_DATA_HELD_ITEM, heldItem);
}
}
void ClearMailItemId(u8 mailId)
{
gSaveBlock1Ptr->mail[mailId].itemId = ITEM_NONE;
}
u8 TakeMailFromMon2(struct Pokemon *mon)
{
u8 i;
u8 newHeldItem[2];
u8 newMailId;
newHeldItem[0] = ITEM_NONE;
newHeldItem[1] = ITEM_NONE << 8;
newMailId = 0xFF;
for (i = PARTY_SIZE; i < MAIL_COUNT; i++)
{
if (gSaveBlock1Ptr->mail[i].itemId == ITEM_NONE)
{
memcpy(&gSaveBlock1Ptr->mail[i], &gSaveBlock1Ptr->mail[GetMonData(mon, MON_DATA_MAIL)], sizeof(struct MailStruct));
gSaveBlock1Ptr->mail[GetMonData(mon, MON_DATA_MAIL)].itemId = ITEM_NONE;
SetMonData(mon, MON_DATA_MAIL, &newMailId);
SetMonData(mon, MON_DATA_HELD_ITEM, newHeldItem);
return i;
}
}
return 0xFF;
}
bool8 ItemIsMail(u16 itemId)
{
switch (itemId)
{
case ITEM_ORANGE_MAIL:
case ITEM_HARBOR_MAIL:
case ITEM_GLITTER_MAIL:
case ITEM_MECH_MAIL:
case ITEM_WOOD_MAIL:
case ITEM_WAVE_MAIL:
case ITEM_BEAD_MAIL:
case ITEM_SHADOW_MAIL:
case ITEM_TROPIC_MAIL:
case ITEM_DREAM_MAIL:
case ITEM_FAB_MAIL:
case ITEM_RETRO_MAIL:
return TRUE;
default:
return FALSE;
}
}
+4 -5
View File
@@ -2,7 +2,7 @@
#include "main.h"
#include "m4a.h"
#include "rtc.h"
#include "rng.h"
#include "random.h"
#include "dma3.h"
#include "gba/flash_internal.h"
#include "battle.h"
@@ -29,7 +29,7 @@ extern void MapMusicMain(void);
extern void EnableInterrupts(u16);
extern void sub_8033648(void);
extern u16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void));
extern void remove_some_task(void);
extern void ScanlineEffect_Stop(void);
extern struct SoundInfo gSoundInfo;
extern u32 gFlashMemoryPresent;
@@ -122,7 +122,7 @@ void AgbMain()
ClearDma3Requests();
ResetBgs();
SetDefaultFontsPointer();
InitHeap(gHeap, 0x1C000);
InitHeap(gHeap, HEAP_SIZE);
gSoftResetDisabled = FALSE;
@@ -332,7 +332,6 @@ void SetSerialCallback(IntrCallback callback)
}
extern void CopyBufferedValuesToGpuRegs(void);
extern void ProcessDma3Requests(void);
static void VBlankIntr(void)
{
@@ -426,7 +425,7 @@ void DoSoftReset(void)
{
REG_IME = 0;
m4aSoundVSyncOff();
remove_some_task();
ScanlineEffect_Stop();
DmaStop(1);
DmaStop(2);
DmaStop(3);
+2414
View File
File diff suppressed because it is too large Load Diff
+302
View File
@@ -0,0 +1,302 @@
#include "global.h"
#include "mystery_event_menu.h"
#include "link.h"
#include "main.h"
#include "menu.h"
#include "mystery_event_script.h"
#include "palette.h"
#include "save.h"
#include "constants/songs.h"
#include "sound.h"
#include "sprite.h"
#include "string_util.h"
#include "strings.h"
#include "task.h"
#include "text.h"
#include "bg.h"
#include "window.h"
#include "gpu_regs.h"
#include "text_window.h"
#include "decompress.h"
// this file's functions
static void CB2_MysteryEventMenu(void);
static void PrintMysteryMenuText(u8 windowId, const u8 *text, u8 x, u8 y, s32 speed);
// EWRAM vars
static EWRAM_DATA u8 sUnknown_0203BCF8 = 0; // set but unused
// const rom data
static const struct BgTemplate sBgTemplates[] =
{
{
.bg = 0,
.charBaseIndex = 2,
.mapBaseIndex = 31,
.screenSize = 0,
.paletteMode = 0,
.priority = 0,
.baseTile = 0
}
};
static const struct WindowTemplate sWindowTemplates[] =
{
{0, 4, 15, 22, 4, 14, 20},
{0, 7, 6, 16, 4, 14, 0x6C},
DUMMY_WIN_TEMPLATE
};
// code
static void VBlankCB(void)
{
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
}
static bool8 CheckLanguageMatch(void)
{
return (gLinkPlayers[0].language == gLinkPlayers[1].language);
}
void CB2_InitMysteryEventMenu(void)
{
ResetSpriteData();
FreeAllSpritePalettes();
ResetTasks();
SetVBlankCallback(VBlankCB);
ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates));
if (InitWindows(sWindowTemplates))
{
s32 i;
DeactivateAllTextPrinters();
for (i = 0; i < 2; i++)
FillWindowPixelBuffer(i, 0);
FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 0x1E, 0x14);
sub_809882C(0, 1u, 0xD0u);
sub_81978B0(0xE0);
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON);
SetGpuReg(REG_OFFSET_BLDCNT, 0);
CreateTask(Task_DestroySelf, 0);
StopMapMusic();
RunTasks();
AnimateSprites();
BuildOamBuffer();
RunTextPrinters();
UpdatePaletteFade();
FillPalette(0, 0, 2);
SetMainCallback2(CB2_MysteryEventMenu);
}
}
static bool8 GetEventLoadMessage(u8 *dest, u32 status)
{
bool8 retVal = TRUE;
if (status == 0)
{
StringCopy(dest, gText_EventSafelyLoaded);
retVal = FALSE;
}
if (status == 2)
retVal = FALSE;
if (status == 1)
StringCopy(dest, gText_LoadErrorEndingSession);
return retVal;
}
static void CB2_MysteryEventMenu(void)
{
switch (gMain.state)
{
case 0:
SetWindowBorderStyle(0, 1, 1, 0xD);
PutWindowTilemap(0);
CopyWindowToVram(0, 3);
ShowBg(0);
BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
gMain.state++;
break;
case 1:
if (!gPaletteFade.active)
{
PrintMysteryMenuText(0, gText_LinkStandby2, 1, 2, 1);
gMain.state++;
}
break;
case 2:
if (!IsTextPrinterActive(0))
{
gMain.state++;
gLinkType = 21761;
OpenLink();
}
break;
case 3:
if ((gLinkStatus & 0x20) && (gLinkStatus & 0x1C) > 4)
{
PlaySE(SE_PIN);
PrintMysteryMenuText(0, gText_PressAToLoadEvent, 1, 2, 1);
gMain.state++;
}
if (gMain.newKeys & B_BUTTON)
{
PlaySE(SE_SELECT);
CloseLink();
gMain.state = 15;
}
break;
case 4:
if (!IsTextPrinterActive(0))
gMain.state++;
break;
case 5:
if (GetLinkPlayerCount_2() == 2)
{
if (gMain.newKeys & A_BUTTON)
{
PlaySE(SE_SELECT);
sub_800A620();
SetWindowBorderStyle(1, 1, 1, 0xD);
PrintMysteryMenuText(1, gText_LoadingEvent, 1, 2, 0);
PutWindowTilemap(1);
CopyWindowToVram(1, 3);
gMain.state++;
}
else if (gMain.newKeys & B_BUTTON)
{
PlaySE(SE_SELECT);
CloseLink();
gMain.state = 15;
}
}
else
{
GetEventLoadMessage(gStringVar4, 1);
PrintMysteryMenuText(0, gStringVar4, 1, 2, 1);
gMain.state = 13;
}
break;
case 6:
if (IsLinkConnectionEstablished())
{
if (gReceivedRemoteLinkPlayers != 0)
{
if (sub_800A0C8(2, 2) == 3)
{
sub_800AC34();
GetEventLoadMessage(gStringVar4, 1);
PrintMysteryMenuText(0, gStringVar4, 1, 2, 1);
gMain.state = 13;
}
else if (CheckLanguageMatch())
{
PrintMysteryMenuText(0, gText_DontRemoveCableTurnOff, 1, 2, 1);
gMain.state++;
}
else
{
CloseLink();
GetEventLoadMessage(gStringVar4, 1);
PrintMysteryMenuText(0, gStringVar4, 1, 2, 1);
gMain.state = 13;
}
}
}
else if (gMain.newKeys & B_BUTTON)
{
PlaySE(SE_SELECT);
CloseLink();
gMain.state = 15;
}
break;
case 7:
if (!IsTextPrinterActive(0))
gMain.state++;
break;
case 8:
if (GetBlockReceivedStatus())
{
ResetBlockReceivedFlags();
gMain.state++;
}
break;
case 9:
gMain.state++;
break;
case 10:
sub_800AC34();
gMain.state++;
break;
case 11:
if (gReceivedRemoteLinkPlayers == 0)
{
u16 unkVal = RunMysteryEventScript(gDecompressionBuffer);
CpuFill32(0, gDecompressionBuffer, 0x7D4);
if (!GetEventLoadMessage(gStringVar4, unkVal))
TrySavingData(NORMAL_SAVE);
gMain.state++;
}
break;
case 12:
PrintMysteryMenuText(0, gStringVar4, 1, 2, 1);
gMain.state++;
break;
case 13:
if (!IsTextPrinterActive(0))
{
gMain.state++;
sUnknown_0203BCF8 = 0;
}
break;
case 14:
if (gMain.newKeys & A_BUTTON)
{
PlaySE(SE_SELECT);
gMain.state++;
}
break;
case 15:
BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
gMain.state++;
break;
case 16:
if (!gPaletteFade.active)
DoSoftReset();
break;
}
if (gLinkStatus & 0x40 && !IsLinkMaster())
{
CloseLink();
GetEventLoadMessage(gStringVar4, 1);
PrintMysteryMenuText(0, gStringVar4, 1, 2, 1);
gMain.state = 13;
}
RunTasks();
AnimateSprites();
BuildOamBuffer();
RunTextPrinters();
UpdatePaletteFade();
}
static void PrintMysteryMenuText(u8 windowId, const u8 *text, u8 x, u8 y, s32 speed)
{
u8 textColor[3];
u8 letterSpacing = 0;
u8 lineSpacing = 1;
textColor[0] = 1;
textColor[1] = 2;
textColor[2] = 3;
FillWindowPixelBuffer(windowId, (textColor[0]) | (textColor[0] << 4));
AddTextPrinterParameterized2(windowId, 1, x, y, letterSpacing, lineSpacing, textColor, speed, text);
}
+13
View File
@@ -0,0 +1,13 @@
#include "global.h"
const u8 gText_MysteryGiftBerry[] = _("Obtained a {STR_VAR_2} BERRY!\nDad has it at PETALBURG GYM.");
const u8 gText_MysteryGiftBerryTransform[] = _("The {STR_VAR_1} BERRY transformed into\none {STR_VAR_2} BERRY.");
const u8 gText_MysteryGiftBerryObtained[] = _("The {STR_VAR_1} BERRY has already been\nobtained.");
const u8 gText_MysteryGiftSpecialRibbon[] = _("A special RIBBON was awarded to\nyour party POKéMON.");
const u8 gText_MysteryGiftNationalDex[] = _("The POKéDEX has been upgraded\nwith the NATIONAL MODE.");
const u8 gText_MysteryGiftRareWord[] = _("A rare word has been added.");
const u8 gText_MysteryGiftSentOver[] = _("{STR_VAR_1} was sent over!");
const u8 gText_MysteryGiftFullParty[] = _("Your party is full.\n{STR_VAR_1} could not be sent over.");
const u8 gText_MysteryGiftNewTrainer[] = _("A new TRAINER has arrived in\nHOENN.");
const u8 gText_MysteryGiftNewAdversaryInBattleTower[] = _("A new adversary has arrived in the\nBATTLE TOWER.");
const u8 gText_MysteryGiftCantBeUsed[] = _("This data cant be used in\nthis version.");
+396
View File
@@ -0,0 +1,396 @@
#include "global.h"
#include "berry.h"
#include "battle_tower.h"
#include "easy_chat.h"
#include "event_data.h"
#include "mail.h"
#include "mystery_event_script.h"
#include "pokedex.h"
#include "pokemon.h"
#include "pokemon_size_record.h"
#include "script.h"
#include "constants/species.h"
#include "strings.h"
#include "string_util.h"
#include "text.h"
#include "util.h"
#include "mystery_event_msg.h"
#include "pokemon_storage_system.h"
extern void sub_811EFC0(u8);
extern void ValidateEReaderTrainer(void);
extern ScrCmdFunc gMysteryEventScriptCmdTable[];
extern ScrCmdFunc gMysteryEventScriptCmdTableEnd[];
#define LANGUAGE_MASK 0x1
#define VERSION_MASK 0x200
EWRAM_DATA static struct ScriptContext sMysteryEventScriptContext = {0};
static bool32 CheckCompatibility(u16 a1, u32 a2, u16 a3, u32 a4)
{
if (!(a1 & LANGUAGE_MASK))
return FALSE;
if (!(a2 & LANGUAGE_MASK))
return FALSE;
if (!(a3 & 0x4))
return FALSE;
if (!(a4 & VERSION_MASK))
return FALSE;
return TRUE;
}
static void SetIncompatible(void)
{
StringExpandPlaceholders(gStringVar4, gText_MysteryGiftCantBeUsed);
SetMysteryEventScriptStatus(3);
}
static void InitMysteryEventScript(struct ScriptContext *ctx, u8 *script)
{
InitScriptContext(ctx, gMysteryEventScriptCmdTable, gMysteryEventScriptCmdTableEnd);
SetupBytecodeScript(ctx, script);
ctx->data[0] = (u32)script;
ctx->data[1] = 0;
ctx->data[2] = 0;
ctx->data[3] = 0;
}
static bool32 RunMysteryEventScriptCommand(struct ScriptContext *ctx)
{
if (RunScriptCommand(ctx) && ctx->data[3])
return TRUE;
else
return FALSE;
}
void sub_8153870(u8 *script)
{
InitMysteryEventScript(&sMysteryEventScriptContext, script);
}
bool32 sub_8153884(u32 *a0)
{
bool32 ret = RunMysteryEventScriptCommand(&sMysteryEventScriptContext);
*a0 = sMysteryEventScriptContext.data[2];
return ret;
}
u32 RunMysteryEventScript(u8 *script)
{
struct ScriptContext *ctx = &sMysteryEventScriptContext;
InitMysteryEventScript(ctx, script);
while (RunMysteryEventScriptCommand(ctx));
return ctx->data[2];
}
void SetMysteryEventScriptStatus(u32 val)
{
sMysteryEventScriptContext.data[2] = val;
}
static int CalcRecordMixingGiftChecksum(void)
{
unsigned int i;
int sum = 0;
u8 *data = (u8*)(&gSaveBlock1Ptr->recordMixingGift.data);
for (i = 0; i < sizeof(gSaveBlock1Ptr->recordMixingGift.data); i++)
sum += data[i];
return sum;
}
static bool32 IsRecordMixingGiftValid(void)
{
struct RecordMixingGiftData *data = &gSaveBlock1Ptr->recordMixingGift.data;
int checksum = CalcRecordMixingGiftChecksum();
if (data->unk0 == 0
|| data->quantity == 0
|| data->itemId == 0
|| checksum == 0
|| checksum != gSaveBlock1Ptr->recordMixingGift.checksum)
return FALSE;
else
return TRUE;
}
static void ClearRecordMixingGift(void)
{
CpuFill16(0, &gSaveBlock1Ptr->recordMixingGift, sizeof(gSaveBlock1Ptr->recordMixingGift));
}
static void SetRecordMixingGift(u8 unk, u8 quantity, u16 itemId)
{
if (!unk || !quantity || !itemId)
{
ClearRecordMixingGift();
}
else
{
gSaveBlock1Ptr->recordMixingGift.data.unk0 = unk;
gSaveBlock1Ptr->recordMixingGift.data.quantity = quantity;
gSaveBlock1Ptr->recordMixingGift.data.itemId = itemId;
gSaveBlock1Ptr->recordMixingGift.checksum = CalcRecordMixingGiftChecksum();
}
}
u16 GetRecordMixingGift(void)
{
struct RecordMixingGiftData *data = &gSaveBlock1Ptr->recordMixingGift.data;
if (!IsRecordMixingGiftValid())
{
ClearRecordMixingGift();
return 0;
}
else
{
u16 itemId = data->itemId;
data->quantity--;
if (data->quantity == 0)
ClearRecordMixingGift();
else
gSaveBlock1Ptr->recordMixingGift.checksum = CalcRecordMixingGiftChecksum();
return itemId;
}
}
bool8 MEScrCmd_end(struct ScriptContext *ctx)
{
StopScript(ctx);
return TRUE;
}
bool8 MEScrCmd_checkcompat(struct ScriptContext *ctx)
{
u16 v1;
u32 v2;
u16 v3;
u32 v4;
ctx->data[1] = ScriptReadWord(ctx);
v1 = ScriptReadHalfword(ctx);
v2 = ScriptReadWord(ctx);
v3 = ScriptReadHalfword(ctx);
v4 = ScriptReadWord(ctx);
if (CheckCompatibility(v1, v2, v3, v4) == TRUE)
ctx->data[3] = 1;
else
SetIncompatible();
return TRUE;
}
bool8 MEScrCmd_nop(struct ScriptContext *ctx)
{
return FALSE;
}
bool8 MEScrCmd_setstatus(struct ScriptContext *ctx)
{
u8 value = ScriptReadByte(ctx);
ctx->data[2] = value;
return FALSE;
}
bool8 MEScrCmd_setmsg(struct ScriptContext *ctx)
{
u8 value = ScriptReadByte(ctx);
u8 *str = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);
if (value == 0xFF || value == ctx->data[2])
StringExpandPlaceholders(gStringVar4, str);
return FALSE;
}
bool8 MEScrCmd_runscript(struct ScriptContext *ctx)
{
u8 *script = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);
ScriptContext2_RunNewScript(script);
return FALSE;
}
bool8 MEScrCmd_setenigmaberry(struct ScriptContext *ctx)
{
u8 *str;
const u8 *message;
bool32 haveBerry = IsEnigmaBerryValid();
u8 *berry = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);
StringCopyN(gStringVar1, gSaveBlock1Ptr->enigmaBerry.berry.name, BERRY_NAME_COUNT);
SetEnigmaBerry(berry);
StringCopyN(gStringVar2, gSaveBlock1Ptr->enigmaBerry.berry.name, BERRY_NAME_COUNT);
if (!haveBerry)
{
str = gStringVar4;
message = gText_MysteryGiftBerry;
}
else if (StringCompare(gStringVar1, gStringVar2))
{
str = gStringVar4;
message = gText_MysteryGiftBerryTransform;
}
else
{
str = gStringVar4;
message = gText_MysteryGiftBerryObtained;
}
StringExpandPlaceholders(str, message);
ctx->data[2] = 2;
if (IsEnigmaBerryValid() == TRUE)
VarSet(VAR_ENIGMA_BERRY_AVAILABLE, 1);
else
ctx->data[2] = 1;
return FALSE;
}
bool8 MEScrCmd_giveribbon(struct ScriptContext *ctx)
{
u8 index = ScriptReadByte(ctx);
u8 ribbonId = ScriptReadByte(ctx);
GiveGiftRibbonToParty(index, ribbonId);
StringExpandPlaceholders(gStringVar4, gText_MysteryGiftSpecialRibbon);
ctx->data[2] = 2;
return FALSE;
}
bool8 MEScrCmd_initramscript(struct ScriptContext *ctx)
{
u8 mapGroup = ScriptReadByte(ctx);
u8 mapNum = ScriptReadByte(ctx);
u8 objectId = ScriptReadByte(ctx);
u8 *script = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);
u8 *scriptEnd = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);
InitRamScript(script, scriptEnd - script, mapGroup, mapNum, objectId);
return FALSE;
}
bool8 MEScrCmd_givenationaldex(struct ScriptContext *ctx)
{
EnableNationalPokedex();
StringExpandPlaceholders(gStringVar4, gText_MysteryGiftNationalDex);
ctx->data[2] = 2;
return FALSE;
}
bool8 MEScrCmd_addrareword(struct ScriptContext *ctx)
{
sub_811EFC0(ScriptReadByte(ctx));
StringExpandPlaceholders(gStringVar4, gText_MysteryGiftRareWord);
ctx->data[2] = 2;
return FALSE;
}
bool8 MEScrCmd_setrecordmixinggift(struct ScriptContext *ctx)
{
u8 unk = ScriptReadByte(ctx);
u8 quantity = ScriptReadByte(ctx);
u16 itemId = ScriptReadHalfword(ctx);
SetRecordMixingGift(unk, quantity, itemId);
return FALSE;
}
bool8 MEScrCmd_givepokemon(struct ScriptContext *ctx)
{
struct MailStruct mail;
struct Pokemon pokemon;
u16 species;
u16 heldItem;
u32 data = ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0];
void *pokemonPtr = (void *)data;
void *mailPtr = (void *)(data + sizeof(struct Pokemon));
pokemon = *(struct Pokemon *)pokemonPtr;
species = GetMonData(&pokemon, MON_DATA_SPECIES2);
if (species == SPECIES_EGG)
StringCopyN(gStringVar1, gText_EggNickname, POKEMON_NAME_LENGTH + 1);
else
StringCopyN(gStringVar1, gText_Pokemon, POKEMON_NAME_LENGTH + 1);
if (gPlayerPartyCount == PARTY_SIZE)
{
StringExpandPlaceholders(gStringVar4, gText_MysteryGiftFullParty);
ctx->data[2] = 3;
}
else
{
memcpy(&gPlayerParty[5], pokemonPtr, sizeof(struct Pokemon));
memcpy(&mail, mailPtr, sizeof(struct MailStruct));
if (species != SPECIES_EGG)
{
u16 pokedexNum = SpeciesToNationalPokedexNum(species);
GetSetPokedexFlag(pokedexNum, FLAG_SET_SEEN);
GetSetPokedexFlag(pokedexNum, FLAG_SET_CAUGHT);
}
heldItem = GetMonData(&gPlayerParty[5], MON_DATA_HELD_ITEM);
if (ItemIsMail(heldItem))
GiveMailToMon2(&gPlayerParty[5], &mail);
CompactPartySlots();
CalculatePlayerPartyCount();
StringExpandPlaceholders(gStringVar4, gText_MysteryGiftSentOver);
ctx->data[2] = 2;
}
return FALSE;
}
bool8 MEScrCmd_addtrainer(struct ScriptContext *ctx)
{
u32 data = ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0];
memcpy((void*)(gSaveBlock2Ptr) + 0xBEC, (void *)data, 0xBC);
ValidateEReaderTrainer();
StringExpandPlaceholders(gStringVar4, gText_MysteryGiftNewTrainer);
ctx->data[2] = 2;
return FALSE;
}
bool8 MEScrCmd_enableresetrtc(struct ScriptContext *ctx)
{
EnableResetRTC();
StringExpandPlaceholders(gStringVar4, gText_InGameClockUsable);
ctx->data[2] = 2;
return FALSE;
}
bool8 MEScrCmd_checksum(struct ScriptContext *ctx)
{
int checksum = ScriptReadWord(ctx);
u8 *data = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);
u8 *dataEnd = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);
if (checksum != CalcByteArraySum(data, dataEnd - data))
{
ctx->data[3] = 0;
ctx->data[2] = 1;
}
return TRUE;
}
bool8 MEScrCmd_crc(struct ScriptContext *ctx)
{
int crc = ScriptReadWord(ctx);
u8 *data = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);
u8 *dataEnd = (u8 *)(ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0]);
if (crc != CalcCRC16(data, dataEnd - data))
{
ctx->data[3] = 0;
ctx->data[2] = 1;
}
return TRUE;
}
+2175
View File
File diff suppressed because it is too large Load Diff
+4 -5
View File
@@ -1,6 +1,6 @@
#include "global.h"
#include "new_game.h"
#include "rng.h"
#include "random.h"
#include "pokemon.h"
#include "roamer.h"
#include "pokemon_size_record.h"
@@ -33,7 +33,6 @@ extern void Overworld_SetWarpDestination(s8 mapBank, s8 mapNo, s8 warpNo, s8 xPo
extern void warp_in(void);
extern void sub_80BB358(void);
extern void ResetBagScrollPositions(void);
extern void sub_813624C(void); // clears something pokeblock related
extern void ResetPokedex(void);
extern void sub_8084400(void);
extern void ClearMailData(void);
@@ -59,7 +58,7 @@ extern void ResetContestLinkResults(void);
extern void ResetPokeJumpResults(void);
extern void SetBerryPowder(u32* powder, u32 newValue);
extern u8 gUnknown_082715DE[];
extern u8 EventScript_2715DE[];
void WriteUnalignedWord(u32 var, u8 *dataPtr)
{
@@ -148,7 +147,7 @@ void sub_808447C(void)
ZeroPlayerPartyMons();
ZeroEnemyPartyMons();
ResetBagScrollPositions();
sub_813624C();
ResetPokeblockScrollPositions();
}
void NewGameInitData(void)
@@ -198,7 +197,7 @@ void NewGameInitData(void)
ResetFanClub();
ResetLotteryCorner();
WarpToTruck();
ScriptContext2_RunNewScript(gUnknown_082715DE);
ScriptContext2_RunNewScript(EventScript_2715DE);
ResetMiniGamesResults();
copy_strings_to_sav1();
SetLilycoveLady();
+662
View File
@@ -0,0 +1,662 @@
#include "global.h"
#include "option_menu.h"
#include "main.h"
#include "menu.h"
#include "scanline_effect.h"
#include "palette.h"
#include "sprite.h"
#include "task.h"
#include "bg.h"
#include "gpu_regs.h"
#include "window.h"
#include "text.h"
#include "text_window.h"
#include "international_string_util.h"
#include "strings.h"
extern void SetPokemonCryStereo(u32 val);
// Task data
enum
{
TD_MENUSELECTION,
TD_TEXTSPEED,
TD_BATTLESCENE,
TD_BATTLESTYLE,
TD_SOUND,
TD_BUTTONMODE,
TD_FRAMETYPE,
};
// Menu items
enum
{
MENUITEM_TEXTSPEED,
MENUITEM_BATTLESCENE,
MENUITEM_BATTLESTYLE,
MENUITEM_SOUND,
MENUITEM_BUTTONMODE,
MENUITEM_FRAMETYPE,
MENUITEM_CANCEL,
MENUITEM_COUNT,
};
// Window Ids
enum
{
WIN_TEXT_OPTION,
WIN_OPTIONS
};
// this file's functions
static void Task_OptionMenuFadeIn(u8 taskId);
static void Task_OptionMenuProcessInput(u8 taskId);
static void Task_OptionMenuSave(u8 taskId);
static void Task_OptionMenuFadeOut(u8 taskId);
static void HighlightOptionMenuItem(u8 selection);
static u8 TextSpeed_ProcessInput(u8 selection);
static void TextSpeed_DrawChoices(u8 selection);
static u8 BattleScene_ProcessInput(u8 selection);
static void BattleScene_DrawChoices(u8 selection);
static u8 BattleStyle_ProcessInput(u8 selection);
static void BattleStyle_DrawChoices(u8 selection);
static u8 Sound_ProcessInput(u8 selection);
static void Sound_DrawChoices(u8 selection);
static u8 FrameType_ProcessInput(u8 selection);
static void FrameType_DrawChoices(u8 selection);
static u8 ButtonMode_ProcessInput(u8 selection);
static void ButtonMode_DrawChoices(u8 selection);
static void DrawTextOption(void);
static void DrawOptionMenuTexts(void);
static void sub_80BB154(void);
// EWRAM vars
EWRAM_DATA static bool8 sArrowPressed = FALSE;
// const rom data
static const u16 sUnknown_0855C604[] = INCBIN_U16("graphics/misc/option_menu_text.gbapal");
// note: this is only used in the Japanese release
static const u8 sEqualSignGfx[] = INCBIN_U8("graphics/misc/option_menu_equals_sign.4bpp");
static const u8 *const sOptionMenuItemsNames[MENUITEM_COUNT] =
{
gText_TextSpeed,
gText_BattleScene,
gText_BattleStyle,
gText_Sound,
gText_ButtonMode,
gText_Frame,
gText_OptionMenuCancel,
};
static const struct WindowTemplate sOptionMenuWinTemplates[] =
{
{1, 2, 1, 0x1A, 2, 1, 2},
{0, 2, 5, 0x1A, 0xE, 1, 0x36},
DUMMY_WIN_TEMPLATE
};
static const struct BgTemplate sOptionMenuBgTemplates[] =
{
{
.bg = 1,
.charBaseIndex = 1,
.mapBaseIndex = 30,
.screenSize = 0,
.paletteMode = 0,
.priority = 0,
.baseTile = 0
},
{
.bg = 0,
.charBaseIndex = 1,
.mapBaseIndex = 31,
.screenSize = 0,
.paletteMode = 0,
.priority = 1,
.baseTile = 0
}
};
static const u16 sUnknown_0855C6A0[] = {0x7E51};
// code
static void MainCB2(void)
{
RunTasks();
AnimateSprites();
BuildOamBuffer();
UpdatePaletteFade();
}
static void VBlankCB(void)
{
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
}
void CB2_InitOptionMenu(void)
{
switch (gMain.state)
{
default:
case 0:
SetVBlankCallback(NULL);
gMain.state++;
break;
case 1:
{
u8 *addr;
u32 size;
addr = (u8 *)VRAM;
size = 0x18000;
while (1)
{
DmaFill16(3, 0, addr, 0x1000);
addr += 0x1000;
size -= 0x1000;
if (size <= 0x1000)
{
DmaFill16(3, 0, addr, size);
break;
}
}
DmaClear32(3, OAM, OAM_SIZE);
DmaClear16(3, PLTT, PLTT_SIZE);
SetGpuReg(REG_OFFSET_DISPCNT, 0);
ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(0, sOptionMenuBgTemplates, ARRAY_COUNT(sOptionMenuBgTemplates));
ChangeBgX(0, 0, 0);
ChangeBgY(0, 0, 0);
ChangeBgX(1, 0, 0);
ChangeBgY(1, 0, 0);
ChangeBgX(2, 0, 0);
ChangeBgY(2, 0, 0);
ChangeBgX(3, 0, 0);
ChangeBgY(3, 0, 0);
InitWindows(sOptionMenuWinTemplates);
DeactivateAllTextPrinters();
SetGpuReg(REG_OFFSET_WIN0H, 0);
SetGpuReg(REG_OFFSET_WIN0V, 0);
SetGpuReg(REG_OFFSET_WININ, 1);
SetGpuReg(REG_OFFSET_WINOUT, 35);
SetGpuReg(REG_OFFSET_BLDCNT, 193);
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
SetGpuReg(REG_OFFSET_BLDY, 4);
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
ShowBg(0);
ShowBg(1);
gMain.state++;
}
break;
case 2:
ResetPaletteFade();
ScanlineEffect_Stop();
ResetTasks();
ResetSpriteData();
gMain.state++;
break;
case 3:
LoadBgTiles(1, GetWindowFrameTilesPal(gSaveBlock2Ptr->optionsWindowFrameType)->tiles, 0x120, 0x1A2);
gMain.state++;
break;
case 4:
LoadPalette(sUnknown_0855C6A0, 0, sizeof(sUnknown_0855C6A0));
LoadPalette(GetWindowFrameTilesPal(gSaveBlock2Ptr->optionsWindowFrameType)->pal, 0x70, 0x20);
gMain.state++;
break;
case 5:
LoadPalette(sUnknown_0855C604, 0x10, sizeof(sUnknown_0855C604));
gMain.state++;
break;
case 6:
PutWindowTilemap(0);
DrawTextOption();
gMain.state++;
break;
case 7:
gMain.state++;
break;
case 8:
PutWindowTilemap(1);
DrawOptionMenuTexts();
gMain.state++;
case 9:
sub_80BB154();
gMain.state++;
break;
case 10:
{
u8 taskId = CreateTask(Task_OptionMenuFadeIn, 0);
gTasks[taskId].data[TD_MENUSELECTION] = 0;
gTasks[taskId].data[TD_TEXTSPEED] = gSaveBlock2Ptr->optionsTextSpeed;
gTasks[taskId].data[TD_BATTLESCENE] = gSaveBlock2Ptr->optionsBattleSceneOff;
gTasks[taskId].data[TD_BATTLESTYLE] = gSaveBlock2Ptr->optionsBattleStyle;
gTasks[taskId].data[TD_SOUND] = gSaveBlock2Ptr->optionsSound;
gTasks[taskId].data[TD_BUTTONMODE] = gSaveBlock2Ptr->optionsButtonMode;
gTasks[taskId].data[TD_FRAMETYPE] = gSaveBlock2Ptr->optionsWindowFrameType;
TextSpeed_DrawChoices(gTasks[taskId].data[TD_TEXTSPEED]);
BattleScene_DrawChoices(gTasks[taskId].data[TD_BATTLESCENE]);
BattleStyle_DrawChoices(gTasks[taskId].data[TD_BATTLESTYLE]);
Sound_DrawChoices(gTasks[taskId].data[TD_SOUND]);
ButtonMode_DrawChoices(gTasks[taskId].data[TD_BUTTONMODE]);
FrameType_DrawChoices(gTasks[taskId].data[TD_FRAMETYPE]);
HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]);
CopyWindowToVram(WIN_OPTIONS, 3);
gMain.state++;
break;
}
case 11:
BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
SetVBlankCallback(VBlankCB);
SetMainCallback2(MainCB2);
return;
}
}
static void Task_OptionMenuFadeIn(u8 taskId)
{
if (!gPaletteFade.active)
gTasks[taskId].func = Task_OptionMenuProcessInput;
}
static void Task_OptionMenuProcessInput(u8 taskId)
{
if (gMain.newKeys & A_BUTTON)
{
if (gTasks[taskId].data[TD_MENUSELECTION] == MENUITEM_CANCEL)
gTasks[taskId].func = Task_OptionMenuSave;
}
else if (gMain.newKeys & B_BUTTON)
{
gTasks[taskId].func = Task_OptionMenuSave;
}
else if (gMain.newKeys & DPAD_UP)
{
if (gTasks[taskId].data[TD_MENUSELECTION] > 0)
gTasks[taskId].data[TD_MENUSELECTION]--;
else
gTasks[taskId].data[TD_MENUSELECTION] = 6;
HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]);
}
else if (gMain.newKeys & DPAD_DOWN)
{
if (gTasks[taskId].data[TD_MENUSELECTION] <= 5)
gTasks[taskId].data[TD_MENUSELECTION]++;
else
gTasks[taskId].data[TD_MENUSELECTION] = 0;
HighlightOptionMenuItem(gTasks[taskId].data[TD_MENUSELECTION]);
}
else
{
u8 previousOption;
switch (gTasks[taskId].data[TD_MENUSELECTION])
{
case MENUITEM_TEXTSPEED:
previousOption = gTasks[taskId].data[TD_TEXTSPEED];
gTasks[taskId].data[TD_TEXTSPEED] = TextSpeed_ProcessInput(gTasks[taskId].data[TD_TEXTSPEED]);
if (previousOption != gTasks[taskId].data[TD_TEXTSPEED])
TextSpeed_DrawChoices(gTasks[taskId].data[TD_TEXTSPEED]);
break;
case MENUITEM_BATTLESCENE:
previousOption = gTasks[taskId].data[TD_BATTLESCENE];
gTasks[taskId].data[TD_BATTLESCENE] = BattleScene_ProcessInput(gTasks[taskId].data[TD_BATTLESCENE]);
if (previousOption != gTasks[taskId].data[TD_BATTLESCENE])
BattleScene_DrawChoices(gTasks[taskId].data[TD_BATTLESCENE]);
break;
case MENUITEM_BATTLESTYLE:
previousOption = gTasks[taskId].data[TD_BATTLESTYLE];
gTasks[taskId].data[TD_BATTLESTYLE] = BattleStyle_ProcessInput(gTasks[taskId].data[TD_BATTLESTYLE]);
if (previousOption != gTasks[taskId].data[TD_BATTLESTYLE])
BattleStyle_DrawChoices(gTasks[taskId].data[TD_BATTLESTYLE]);
break;
case MENUITEM_SOUND:
previousOption = gTasks[taskId].data[TD_SOUND];
gTasks[taskId].data[TD_SOUND] = Sound_ProcessInput(gTasks[taskId].data[TD_SOUND]);
if (previousOption != gTasks[taskId].data[TD_SOUND])
Sound_DrawChoices(gTasks[taskId].data[TD_SOUND]);
break;
case MENUITEM_BUTTONMODE:
previousOption = gTasks[taskId].data[TD_BUTTONMODE];
gTasks[taskId].data[TD_BUTTONMODE] = ButtonMode_ProcessInput(gTasks[taskId].data[TD_BUTTONMODE]);
if (previousOption != gTasks[taskId].data[TD_BUTTONMODE])
ButtonMode_DrawChoices(gTasks[taskId].data[TD_BUTTONMODE]);
break;
case MENUITEM_FRAMETYPE:
previousOption = gTasks[taskId].data[TD_FRAMETYPE];
gTasks[taskId].data[TD_FRAMETYPE] = FrameType_ProcessInput(gTasks[taskId].data[TD_FRAMETYPE]);
if (previousOption != gTasks[taskId].data[TD_FRAMETYPE])
FrameType_DrawChoices(gTasks[taskId].data[TD_FRAMETYPE]);
break;
default:
return;
}
if (sArrowPressed)
{
sArrowPressed = FALSE;
CopyWindowToVram(WIN_OPTIONS, 2);
}
}
}
static void Task_OptionMenuSave(u8 taskId)
{
gSaveBlock2Ptr->optionsTextSpeed = gTasks[taskId].data[TD_TEXTSPEED];
gSaveBlock2Ptr->optionsBattleSceneOff = gTasks[taskId].data[TD_BATTLESCENE];
gSaveBlock2Ptr->optionsBattleStyle = gTasks[taskId].data[TD_BATTLESTYLE];
gSaveBlock2Ptr->optionsSound = gTasks[taskId].data[TD_SOUND];
gSaveBlock2Ptr->optionsButtonMode = gTasks[taskId].data[TD_BUTTONMODE];
gSaveBlock2Ptr->optionsWindowFrameType = gTasks[taskId].data[TD_FRAMETYPE];
BeginNormalPaletteFade(-1, 0, 0, 0x10, 0);
gTasks[taskId].func = Task_OptionMenuFadeOut;
}
static void Task_OptionMenuFadeOut(u8 taskId)
{
if (!gPaletteFade.active)
{
DestroyTask(taskId);
FreeAllWindowBuffers();
SetMainCallback2(gMain.savedCallback);
}
}
static void HighlightOptionMenuItem(u8 index)
{
SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(16, 224));
SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(index * 16 + 40, index * 16 + 56));
}
static void DrawOptionMenuChoice(const u8 *text, u8 x, u8 y, u8 style)
{
u8 dst[16];
u16 i;
for (i = 0; *text != EOS && i <= 14; i++)
dst[i] = *(text++);
if (style != 0)
{
dst[2] = 4;
dst[5] = 5;
}
dst[i] = EOS;
PrintTextOnWindow(WIN_OPTIONS, 1, dst, x, y + 1, TEXT_SPEED_FF, NULL);
}
static u8 TextSpeed_ProcessInput(u8 selection)
{
if (gMain.newKeys & DPAD_RIGHT)
{
if (selection <= 1)
selection++;
else
selection = 0;
sArrowPressed = TRUE;
}
if (gMain.newKeys & DPAD_LEFT)
{
if (selection != 0)
selection--;
else
selection = 2;
sArrowPressed = TRUE;
}
return selection;
}
static void TextSpeed_DrawChoices(u8 selection)
{
u8 styles[3];
s32 widthSlow, widthMid, widthFast, xMid;
styles[0] = 0;
styles[1] = 0;
styles[2] = 0;
styles[selection] = 1;
DrawOptionMenuChoice(gText_TextSpeedSlow, 104, 0, styles[0]);
widthSlow = GetStringWidth(1, gText_TextSpeedSlow, 0);
widthMid = GetStringWidth(1, gText_TextSpeedMid, 0);
widthFast = GetStringWidth(1, gText_TextSpeedFast, 0);
widthMid -= 94;
xMid = (widthSlow - widthMid - widthFast) / 2 + 104;
DrawOptionMenuChoice(gText_TextSpeedMid, xMid, 0, styles[1]);
DrawOptionMenuChoice(gText_TextSpeedFast, GetStringRightAlignXOffset(1, gText_TextSpeedFast, 198), 0, styles[2]);
}
static u8 BattleScene_ProcessInput(u8 selection)
{
if (gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT))
{
selection ^= 1;
sArrowPressed = TRUE;
}
return selection;
}
static void BattleScene_DrawChoices(u8 selection)
{
u8 styles[2];
styles[0] = 0;
styles[1] = 0;
styles[selection] = 1;
DrawOptionMenuChoice(gText_BattleSceneOn, 104, 16, styles[0]);
DrawOptionMenuChoice(gText_BattleSceneOff, GetStringRightAlignXOffset(1, gText_BattleSceneOff, 198), 16, styles[1]);
}
static u8 BattleStyle_ProcessInput(u8 selection)
{
if (gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT))
{
selection ^= 1;
sArrowPressed = TRUE;
}
return selection;
}
static void BattleStyle_DrawChoices(u8 selection)
{
u8 styles[2];
styles[0] = 0;
styles[1] = 0;
styles[selection] = 1;
DrawOptionMenuChoice(gText_BattleStyleShift, 104, 32, styles[0]);
DrawOptionMenuChoice(gText_BattleStyleSet, GetStringRightAlignXOffset(1, gText_BattleStyleSet, 198), 32, styles[1]);
}
static u8 Sound_ProcessInput(u8 selection)
{
if (gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT))
{
selection ^= 1;
SetPokemonCryStereo(selection);
sArrowPressed = TRUE;
}
return selection;
}
static void Sound_DrawChoices(u8 selection)
{
u8 styles[2];
styles[0] = 0;
styles[1] = 0;
styles[selection] = 1;
DrawOptionMenuChoice(gText_SoundMono, 104, 48, styles[0]);
DrawOptionMenuChoice(gText_SoundStereo, GetStringRightAlignXOffset(1, gText_SoundStereo, 198), 48, styles[1]);
}
static u8 FrameType_ProcessInput(u8 selection)
{
if (gMain.newKeys & DPAD_RIGHT)
{
if (selection < WINDOW_FRAMES_COUNT - 1)
selection++;
else
selection = 0;
LoadBgTiles(1, GetWindowFrameTilesPal(selection)->tiles, 0x120, 0x1A2);
LoadPalette(GetWindowFrameTilesPal(selection)->pal, 0x70, 0x20);
sArrowPressed = TRUE;
}
if (gMain.newKeys & DPAD_LEFT)
{
if (selection != 0)
selection--;
else
selection = WINDOW_FRAMES_COUNT - 1;
LoadBgTiles(1, GetWindowFrameTilesPal(selection)->tiles, 0x120, 0x1A2);
LoadPalette(GetWindowFrameTilesPal(selection)->pal, 0x70, 0x20);
sArrowPressed = TRUE;
}
return selection;
}
static void FrameType_DrawChoices(u8 selection)
{
u8 text[16];
u8 n = selection + 1;
u16 i;
for (i = 0; gText_FrameTypeNumber[i] != EOS && i <= 5; i++)
text[i] = gText_FrameTypeNumber[i];
// Convert a number to decimal string
if (n / 10 != 0)
{
text[i] = n / 10 + CHAR_0;
i++;
text[i] = n % 10 + CHAR_0;
i++;
}
else
{
text[i] = n % 10 + CHAR_0;
i++;
text[i] = 0x77;
i++;
}
text[i] = EOS;
DrawOptionMenuChoice(gText_FrameType, 104, 80, 0);
DrawOptionMenuChoice(text, 128, 80, 1);
}
static u8 ButtonMode_ProcessInput(u8 selection)
{
if (gMain.newKeys & DPAD_RIGHT)
{
if (selection <= 1)
selection++;
else
selection = 0;
sArrowPressed = TRUE;
}
if (gMain.newKeys & DPAD_LEFT)
{
if (selection != 0)
selection--;
else
selection = 2;
sArrowPressed = TRUE;
}
return selection;
}
static void ButtonMode_DrawChoices(u8 selection)
{
s32 widthNormal, widthLR, widthLA, xLR;
u8 styles[3];
styles[0] = 0;
styles[1] = 0;
styles[2] = 0;
styles[selection] = 1;
DrawOptionMenuChoice(gText_ButtonTypeNormal, 104, 64, styles[0]);
widthNormal = GetStringWidth(1, gText_ButtonTypeNormal, 0);
widthLR = GetStringWidth(1, gText_ButtonTypeLR, 0);
widthLA = GetStringWidth(1, gText_ButtonTypeLEqualsA, 0);
widthLR -= 94;
xLR = (widthNormal - widthLR - widthLA) / 2 + 104;
DrawOptionMenuChoice(gText_ButtonTypeLR, xLR, 64, styles[1]);
DrawOptionMenuChoice(gText_ButtonTypeLEqualsA, GetStringRightAlignXOffset(1, gText_ButtonTypeLEqualsA, 198), 64, styles[2]);
}
static void DrawTextOption(void)
{
FillWindowPixelBuffer(WIN_TEXT_OPTION, 0x11);
PrintTextOnWindow(WIN_TEXT_OPTION, 1, gText_Option, 8, 1, TEXT_SPEED_FF, NULL);
CopyWindowToVram(WIN_TEXT_OPTION, 3);
}
static void DrawOptionMenuTexts(void)
{
u8 i;
FillWindowPixelBuffer(WIN_OPTIONS, 0x11);
for (i = 0; i < MENUITEM_COUNT; i++)
{
PrintTextOnWindow(WIN_OPTIONS, 1, sOptionMenuItemsNames[i], 8, (i * 16) + 1, TEXT_SPEED_FF, NULL);
}
CopyWindowToVram(WIN_OPTIONS, 3);
}
static void sub_80BB154(void)
{
// bg, tileNum, x, y, width, height, pal
FillBgTilemapBufferRect(1, 0x1A2, 1, 0, 1, 1, 7);
FillBgTilemapBufferRect(1, 0x1A3, 2, 0, 0x1B, 1, 7);
FillBgTilemapBufferRect(1, 0x1A4, 28, 0, 1, 1, 7);
FillBgTilemapBufferRect(1, 0x1A5, 1, 1, 1, 2, 7);
FillBgTilemapBufferRect(1, 0x1A7, 28, 1, 1, 2, 7);
FillBgTilemapBufferRect(1, 0x1A8, 1, 3, 1, 1, 7);
FillBgTilemapBufferRect(1, 0x1A9, 2, 3, 0x1B, 1, 7);
FillBgTilemapBufferRect(1, 0x1AA, 28, 3, 1, 1, 7);
FillBgTilemapBufferRect(1, 0x1A2, 1, 4, 1, 1, 7);
FillBgTilemapBufferRect(1, 0x1A3, 2, 4, 0x1A, 1, 7);
FillBgTilemapBufferRect(1, 0x1A4, 28, 4, 1, 1, 7);
FillBgTilemapBufferRect(1, 0x1A5, 1, 5, 1, 0x12, 7);
FillBgTilemapBufferRect(1, 0x1A7, 28, 5, 1, 0x12, 7);
FillBgTilemapBufferRect(1, 0x1A8, 1, 19, 1, 1, 7);
FillBgTilemapBufferRect(1, 0x1A9, 2, 19, 0x1A, 1, 7);
FillBgTilemapBufferRect(1, 0x1AA, 28, 19, 1, 1, 7);
CopyBgTilemapBufferToVram(1);
}
View File
+74 -270
View File
@@ -4,6 +4,7 @@
#include "decompress.h"
#include "gpu_regs.h"
#include "task.h"
#include "constants/rgb.h"
enum
{
@@ -65,7 +66,8 @@ static const struct PaletteStructTemplate gDummyPaletteStructTemplate = {
.uid = 0xFFFF,
.pst_field_B_5 = 1
};
static const u8 gUnknown_0852489C[] = {
static const u8 sRoundedDownGrayscaleMap[] = {
0, 0, 0, 0, 0,
5, 5, 5, 5, 5,
11, 11, 11, 11, 11,
@@ -620,7 +622,7 @@ static u8 UpdateFastPaletteFade(void)
gPlttBufferFaded[i] = r | (g << 5) | (b << 10);
}
break;
case FAST_FADE_OUT_TO_WHTIE:
case FAST_FADE_OUT_TO_WHITE:
for (i = paletteOffsetStart; i < paletteOffsetEnd; i++)
{
struct PlttData *data = (struct PlttData *)&gPlttBufferFaded[i];
@@ -701,7 +703,7 @@ static u8 UpdateFastPaletteFade(void)
case FAST_FADE_IN_FROM_BLACK:
CpuCopy32(gPlttBufferUnfaded, gPlttBufferFaded, PLTT_SIZE);
break;
case FAST_FADE_OUT_TO_WHTIE:
case FAST_FADE_OUT_TO_WHITE:
CpuFill32(0xFFFFFFFF, gPlttBufferFaded, PLTT_SIZE);
break;
case FAST_FADE_OUT_TO_BLACK:
@@ -838,292 +840,94 @@ void BlendPalettesUnfaded(u32 selectedPalettes, u8 coeff, u16 color)
void TintPalette_GrayScale(u16 *palette, u16 count)
{
s32 r;
s32 g;
s32 b;
s32 gray;
s32 r, g, b, i;
u32 gray;
int i;
for (i = 0; i < count; i++)
{
r = *palette & 0x1F;
g = (*palette >> 5) & 0x1F;
r = (*palette >> 0) & 0x1F;
g = (*palette >> 5) & 0x1F;
b = (*palette >> 10) & 0x1F;
r *= 0x4C;
r += g * 0x97;
r += b * 0x1D;
gray = r >> 8;
*palette++ = gray << 10 | gray << 5 | gray;
gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8;
*palette++ = (gray << 10) | (gray << 5) | (gray << 0);
}
return;
}
void TintPalette_GrayScale2(u16 *palette, u16 count)
{
s32 r;
s32 g;
s32 b;
s32 gray;
int i;
for (i = 0; i < count; i++)
{
r = *palette & 0x1F;
g = (*palette >> 5) & 0x1F;
b = (*palette >> 10) & 0x1F;
r *= 0x4C;
r += g * 0x97;
r += b * 0x1D;
gray = r >> 8;
if ((u32)gray > 0x1F)
gray = 0x1F;
gray = gUnknown_0852489C[gray];
*palette++ = gray << 10 | gray << 5 | gray;
}
return;
}
#ifdef NONMATCHING
void TintPalette_SepiaTone(u16 *palette, u16 count)
{
s32 r;
s32 g;
s32 b;
s32 r, g, b, i;
u32 gray;
u32 sepia;
s8 r2;
s8 g2;
s8 b2;
int i;
for (i = 0; i < count; i++)
{
r = *palette & 0x1F;
g = (*palette >> 5) & 0x1F;
r = (*palette >> 0) & 0x1F;
g = (*palette >> 5) & 0x1F;
b = (*palette >> 10) & 0x1F;
r *= 0x4C;
r += g * 0x97;
r += b * 0x1D;
gray = (s32)(r >> 8);
sepia = (gray * 0x133);
r2 = (u16)sepia >> 8;
g2 = gray;
b2 = (gray * 15);
if (r2 > 0x1F)
r2 = 0x1F;
*palette++ = b2 << 10 | g2 << 5 | r2;
gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8;
if (gray > 0x1F)
gray = 0x1F;
gray = sRoundedDownGrayscaleMap[gray];
*palette++ = (gray << 10) | (gray << 5) | (gray << 0);
}
return;
}
#else
__attribute__((naked))
void TintPalette_SepiaTone(u16 *palette, u16 count)
{
asm("push {r4-r7,lr}\n\
add r5, r0, #0\n\
lsl r1, #16\n\
lsr r1, #16\n\
cmp r1, #0\n\
beq _080A2BA2\n\
mov r7, #0x1F\n\
add r6, r1, #0\n\
_080A2B50:\n\
ldrh r0, [r5]\n\
mov r1, #0x1F\n\
and r1, r0\n\
lsl r0, #16\n\
lsr r2, r0, #21\n\
and r2, r7\n\
lsr r3, r0, #26\n\
and r3, r7\n\
mov r0, #0x4C\n\
mul r1, r0\n\
mov r0, #0x97\n\
mul r0, r2\n\
add r1, r0\n\
lsl r0, r3, #3\n\
sub r0, r3\n\
lsl r0, #2\n\
add r0, r3\n\
add r1, r0\n\
asr r1, #8\n\
ldr r0, =0x00000133\n\
mul r0, r1\n\
lsl r0, #16\n\
lsr r2, r0, #24\n\
lsl r0, r1, #24\n\
lsr r4, r0, #24\n\
lsl r0, r1, #4\n\
sub r0, r1\n\
lsl r0, #20\n\
lsr r3, r0, #24\n\
cmp r2, #0x1F\n\
ble _080A2B90\n\
mov r2, #0x1F\n\
_080A2B90:\n\
lsl r0, r3, #10\n\
lsl r1, r4, #5\n\
orr r0, r1\n\
orr r0, r2\n\
strh r0, [r5]\n\
add r5, #0x2\n\
sub r6, #0x1\n\
cmp r6, #0\n\
bne _080A2B50\n\
_080A2BA2:\n\
pop {r4-r7}\n\
pop {r0}\n\
bx r0\n\
.pool");
}
#endif // NONMATCHING
#ifdef NONMATCHING
void sub_80A2BAC(u16 *palette, u16 count, u16 a3, u16 a4, u16 a5)
{
s32 r;
s32 g;
s32 b;
s32 gray;
u8 r2;
u8 g2;
u8 b2;
int i;
s32 r, g, b, i;
u32 gray;
for (i = 0; i < count; i++)
{
r = *palette & 0x1F;
g = (*palette >> 5) & 0x1F;
r = (*palette >> 0) & 0x1F;
g = (*palette >> 5) & 0x1F;
b = (*palette >> 10) & 0x1F;
r *= 0x4C;
r += g * 0x97;
r += b * 0x1D;
gray = r >> 8;
r2 = (u16)(gray * a3) >> 8;
g2 = (u16)(gray * a4) >> 8;
b2 = (u16)(gray * a5) >> 8;
if (r2 > 0x1F)
r2 = 0x1F;
if (g2 > 0x1F)
g2 = 0x1F;
if (b2 > 0x1F)
b2 = 0x1F;
*palette++ = b2 << 10 | g2 << 5 | r2;
gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8;
r = (u16)((Q_8_8(1.2) * gray)) >> 8;
g = (u16)((Q_8_8(1.0) * gray)) >> 8;
b = (u16)((Q_8_8(0.94) * gray)) >> 8;
if (r > 31)
r = 31;
*palette++ = (b << 10) | (g << 5) | (r << 0);
}
return;
}
#else
__attribute__((naked))
void sub_80A2BAC(u16 *palette, u16 count, u16 a3, u16 a4, u16 a5)
void TintPalette_CustomTone(u16 *palette, u16 count, u16 rTone, u16 gTone, u16 bTone)
{
asm("push {r4-r7,lr}\n\
mov r7, r9\n\
mov r6, r8\n\
push {r6,r7}\n\
add r5, r0, #0\n\
ldr r0, [sp, #0x1C]\n\
lsl r1, #16\n\
lsr r1, #16\n\
lsl r2, #16\n\
lsr r2, #16\n\
mov r9, r2\n\
lsl r3, #16\n\
lsr r3, #16\n\
mov r8, r3\n\
lsl r0, #16\n\
lsr r0, #16\n\
mov r12, r0\n\
cmp r1, #0\n\
beq _080A2C38\n\
mov r7, #0x1F\n\
add r6, r1, #0\n\
_080A2BD6:\n\
ldrh r0, [r5]\n\
mov r1, #0x1F\n\
and r1, r0\n\
lsl r0, #16\n\
lsr r2, r0, #21\n\
and r2, r7\n\
lsr r3, r0, #26\n\
and r3, r7\n\
mov r0, #0x4C\n\
mul r1, r0\n\
mov r0, #0x97\n\
mul r0, r2\n\
add r1, r0\n\
lsl r0, r3, #3\n\
sub r0, r3\n\
lsl r0, #2\n\
add r0, r3\n\
add r1, r0\n\
asr r1, #8\n\
mov r0, r9\n\
mul r0, r1\n\
lsl r0, #16\n\
lsr r4, r0, #24\n\
mov r0, r8\n\
mul r0, r1\n\
lsl r0, #16\n\
lsr r2, r0, #24\n\
mov r0, r12\n\
mul r0, r1\n\
lsl r0, #16\n\
lsr r3, r0, #24\n\
cmp r4, #0x1F\n\
ble _080A2C1A\n\
mov r4, #0x1F\n\
_080A2C1A:\n\
cmp r2, #0x1F\n\
ble _080A2C20\n\
mov r2, #0x1F\n\
_080A2C20:\n\
cmp r3, #0x1F\n\
ble _080A2C26\n\
mov r3, #0x1F\n\
_080A2C26:\n\
lsl r0, r3, #10\n\
lsl r1, r2, #5\n\
orr r0, r1\n\
orr r0, r4\n\
strh r0, [r5]\n\
add r5, #0x2\n\
sub r6, #0x1\n\
cmp r6, #0\n\
bne _080A2BD6\n\
_080A2C38:\n\
pop {r3,r4}\n\
mov r8, r3\n\
mov r9, r4\n\
pop {r4-r7}\n\
pop {r0}\n\
bx r0");
s32 r, g, b, i;
u32 gray;
for (i = 0; i < count; i++)
{
r = (*palette >> 0) & 0x1F;
g = (*palette >> 5) & 0x1F;
b = (*palette >> 10) & 0x1F;
gray = (r * Q_8_8(0.3) + g * Q_8_8(0.59) + b * Q_8_8(0.1133)) >> 8;
r = (u16)((rTone * gray)) >> 8;
g = (u16)((gTone * gray)) >> 8;
b = (u16)((bTone * gray)) >> 8;
if (r > 31)
r = 31;
if (g > 31)
g = 31;
if (b > 31)
b = 31;
*palette++ = (b << 10) | (g << 5) | (r << 0);
}
}
#endif
void sub_80A2C44(u32 a1, s8 a2, u8 a3, u8 a4, u16 a5, u8 a6, u8 a7)
{
@@ -1153,7 +957,7 @@ void sub_80A2C44(u32 a1, s8 a2, u8 a3, u8 a4, u16 a5, u8 a6, u8 a7)
gTasks[taskId].func(taskId);
}
u32 sub_80A2CF8(u8 var)
bool32 sub_80A2CF8(u8 var)
{
int i;
@@ -1181,7 +985,7 @@ void sub_80A2D54(u8 taskId)
{
u32 wordVar;
s16 *data;
u16 temp;
s16 temp;
data = gTasks[taskId].data;
wordVar = GetWordTaskArg(taskId, 5);
@@ -1191,7 +995,7 @@ void sub_80A2D54(u8 taskId)
data[4] = 0;
BlendPalettes(wordVar, data[0], data[7]);
temp = data[1];
if (data[0] == (s16)temp)
if (data[0] == temp)
{
DestroyTask(taskId);
}
@@ -1200,12 +1004,12 @@ void sub_80A2D54(u8 taskId)
data[0] += data[2];
if (data[2] >= 0)
{
if (data[0] < (s16)temp)
if (data[0] < temp)
{
return;
}
}
else if (data[0] > (s16)temp)
else if (data[0] > temp)
{
return;
}
+1276
View File
File diff suppressed because it is too large Load Diff
+1336
View File
File diff suppressed because it is too large Load Diff
+1107
View File
File diff suppressed because it is too large Load Diff
+542
View File
@@ -0,0 +1,542 @@
#include "global.h"
#include "gba/m4a_internal.h"
#include "pokedex.h"
#include "sprite.h"
#include "graphics.h"
#include "decompress.h"
#include "bg.h"
#include "window.h"
// this file's functions
void sub_80BE604(struct Sprite *sprite);
void sub_80BE658(struct Sprite *sprite);
void sub_80BE758(struct Sprite *sprite);
void sub_80BE780(struct Sprite *sprite);
void sub_80BE44C(struct Sprite *sprite);
void sub_80BE834(struct Sprite *sprite);
// const rom data
#include "data/pokedex_orders.h"
static const struct OamData sOamData_855CFE4 =
{
.y = 160,
.affineMode = 0,
.objMode = 0,
.mosaic = 0,
.bpp = 0,
.shape = 0,
.x = 0,
.matrixNum = 0,
.size = 0,
.tileNum = 0,
.priority = 1,
.paletteNum = 0,
.affineParam = 0
};
static const struct OamData sOamData_855CFEC =
{
.y = 160,
.affineMode = 0,
.objMode = 0,
.mosaic = 0,
.bpp = 0,
.shape = 1,
.x = 0,
.matrixNum = 0,
.size = 0,
.tileNum = 0,
.priority = 0,
.paletteNum = 0,
.affineParam = 0
};
static const struct OamData sOamData_855CFF4 =
{
.y = 160,
.affineMode = 0,
.objMode = 0,
.mosaic = 0,
.bpp = 0,
.shape = 1,
.x = 0,
.matrixNum = 0,
.size = 2,
.tileNum = 0,
.priority = 0,
.paletteNum = 0,
.affineParam = 0
};
static const struct OamData sOamData_855CFFC =
{
.y = 160,
.affineMode = 0,
.objMode = 2,
.mosaic = 0,
.bpp = 0,
.shape = 0,
.x = 0,
.matrixNum = 0,
.size = 2,
.tileNum = 0,
.priority = 1,
.paletteNum = 0,
.affineParam = 0
};
static const struct OamData sOamData_855D004 =
{
.y = 160,
.affineMode = 0,
.objMode = 0,
.mosaic = 0,
.bpp = 0,
.shape = 1,
.x = 0,
.matrixNum = 0,
.size = 3,
.tileNum = 0,
.priority = 0,
.paletteNum = 0,
.affineParam = 0
};
static const struct OamData sOamData_855D00C =
{
.y = 160,
.affineMode = 0,
.objMode = 0,
.mosaic = 0,
.bpp = 0,
.shape = 2,
.x = 0,
.matrixNum = 0,
.size = 0,
.tileNum = 0,
.priority = 0,
.paletteNum = 0,
.affineParam = 0
};
static const union AnimCmd sSpriteAnim_855D014[] =
{
ANIMCMD_FRAME(3, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D01C[] =
{
ANIMCMD_FRAME(1, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D024[] =
{
ANIMCMD_FRAME(16, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D02C[] =
{
ANIMCMD_FRAME(48, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D034[] =
{
ANIMCMD_FRAME(40, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D03C[] =
{
ANIMCMD_FRAME(32, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D044[] =
{
ANIMCMD_FRAME(56, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D04C[] =
{
ANIMCMD_FRAME(64, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D054[] =
{
ANIMCMD_FRAME(96, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D05C[] =
{
ANIMCMD_FRAME(160, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D064[] =
{
ANIMCMD_FRAME(168, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D06C[] =
{
ANIMCMD_FRAME(128, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D074[] =
{
ANIMCMD_FRAME(130, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D07C[] =
{
ANIMCMD_FRAME(132, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D084[] =
{
ANIMCMD_FRAME(134, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D08C[] =
{
ANIMCMD_FRAME(136, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D094[] =
{
ANIMCMD_FRAME(138, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D09C[] =
{
ANIMCMD_FRAME(140, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D0A4[] =
{
ANIMCMD_FRAME(142, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D0AC[] =
{
ANIMCMD_FRAME(144, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D0B4[] =
{
ANIMCMD_FRAME(146, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D0BC[] =
{
ANIMCMD_FRAME(176, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D0C4[] =
{
ANIMCMD_FRAME(178, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D0CC[] =
{
ANIMCMD_FRAME(180, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D0D4[] =
{
ANIMCMD_FRAME(182, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D0DC[] =
{
ANIMCMD_FRAME(184, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D0E4[] =
{
ANIMCMD_FRAME(186, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D0EC[] =
{
ANIMCMD_FRAME(188, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D0F4[] =
{
ANIMCMD_FRAME(190, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D0FC[] =
{
ANIMCMD_FRAME(192, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D104[] =
{
ANIMCMD_FRAME(194, 30),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_855D10C[] =
{
ANIMCMD_FRAME(4, 30),
ANIMCMD_END
};
static const union AnimCmd *const sSpriteAnimTable_855D114[] =
{
sSpriteAnim_855D014
};
static const union AnimCmd *const sSpriteAnimTable_855D118[] =
{
sSpriteAnim_855D01C
};
static const union AnimCmd *const sSpriteAnimTable_855D11C[] =
{
sSpriteAnim_855D024
};
static const union AnimCmd *const sSpriteAnimTable_855D120[] =
{
sSpriteAnim_855D02C,
sSpriteAnim_855D034,
sSpriteAnim_855D03C,
sSpriteAnim_855D044
};
static const union AnimCmd *const sSpriteAnimTable_855D130[] =
{
sSpriteAnim_855D04C,
sSpriteAnim_855D054
};
static const union AnimCmd *const sSpriteAnimTable_855D138[] =
{
sSpriteAnim_855D05C,
sSpriteAnim_855D064
};
static const union AnimCmd *const sSpriteAnimTable_855D140[] =
{
sSpriteAnim_855D06C,
sSpriteAnim_855D074,
sSpriteAnim_855D07C,
sSpriteAnim_855D084,
sSpriteAnim_855D08C,
sSpriteAnim_855D094,
sSpriteAnim_855D09C,
sSpriteAnim_855D0A4,
sSpriteAnim_855D0AC,
sSpriteAnim_855D0B4
};
static const union AnimCmd *const sSpriteAnimTable_855D168[] =
{
sSpriteAnim_855D0BC,
sSpriteAnim_855D0C4,
sSpriteAnim_855D0CC,
sSpriteAnim_855D0D4,
sSpriteAnim_855D0DC,
sSpriteAnim_855D0E4,
sSpriteAnim_855D0EC,
sSpriteAnim_855D0F4,
sSpriteAnim_855D0FC,
sSpriteAnim_855D104
};
static const union AnimCmd *const sSpriteAnimTable_855D190[] =
{
sSpriteAnim_855D10C
};
const struct SpriteTemplate gUnknown_0855D194 =
{
.tileTag = 4096,
.paletteTag = 4096,
.oam = &sOamData_855CFE4,
.anims = sSpriteAnimTable_855D114,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80BE604,
};
const struct SpriteTemplate gUnknown_0855D1AC =
{
.tileTag = 4096,
.paletteTag = 4096,
.oam = &sOamData_855CFEC,
.anims = sSpriteAnimTable_855D118,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80BE658,
};
const struct SpriteTemplate gUnknown_0855D1C4 =
{
.tileTag = 4096,
.paletteTag = 4096,
.oam = &sOamData_855CFF4,
.anims = sSpriteAnimTable_855D120,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80BE758,
};
const struct SpriteTemplate gUnknown_0855D1DC =
{
.tileTag = 4096,
.paletteTag = 4096,
.oam = &sOamData_855CFFC,
.anims = sSpriteAnimTable_855D11C,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80BE780,
};
const struct SpriteTemplate gUnknown_0855D1F4 =
{
.tileTag = 4096,
.paletteTag = 4096,
.oam = &sOamData_855D004,
.anims = sSpriteAnimTable_855D130,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80BE44C,
};
const struct SpriteTemplate gUnknown_0855D20C =
{
.tileTag = 4096,
.paletteTag = 4096,
.oam = &sOamData_855CFF4,
.anims = sSpriteAnimTable_855D138,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80BE44C,
};
const struct SpriteTemplate gUnknown_0855D224 =
{
.tileTag = 4096,
.paletteTag = 4096,
.oam = &sOamData_855D00C,
.anims = sSpriteAnimTable_855D140,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80BE44C,
};
const struct SpriteTemplate gUnknown_0855D23C =
{
.tileTag = 4096,
.paletteTag = 4096,
.oam = &sOamData_855D00C,
.anims = sSpriteAnimTable_855D168,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80BE44C,
};
const struct SpriteTemplate gUnknown_0855D254 =
{
.tileTag = 4096,
.paletteTag = 4096,
.oam = &sOamData_855D00C,
.anims = sSpriteAnimTable_855D190,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_80BE834,
};
const struct CompressedSpriteSheet gSpriteSheets_0855D26C[] =
{
{gPokedexMenu2_Gfx, 0x2000, 4096},
{0}
};
const struct CompressedSpritePalette gSpritePalettes_0855D26C[] =
{
{gPokedexText_Pal, 4096},
{0}
};
const u8 gUnknown_0855D28C[] = {0x4, 0x8, 0x10, 0x20, 0x20};
const u8 gUnknown_0855D291[] = {0x8, 0x4, 0x2, 0x1, 0x1};
const struct BgTemplate gBgTemplates_0855D298[] =
{
{
.bg = 0,
.charBaseIndex = 0,
.mapBaseIndex = 12,
.screenSize = 0,
.paletteMode = 0,
.priority = 0,
.baseTile = 0
},
{
.bg = 1,
.charBaseIndex = 0,
.mapBaseIndex = 13,
.screenSize = 0,
.paletteMode = 0,
.priority = 1,
.baseTile = 0
},
{
.bg = 2,
.charBaseIndex = 2,
.mapBaseIndex = 14,
.screenSize = 0,
.paletteMode = 0,
.priority = 2,
.baseTile = 0
},
{
.bg = 3,
.charBaseIndex = 0,
.mapBaseIndex = 15,
.screenSize = 0,
.paletteMode = 0,
.priority = 3,
.baseTile = 0
}
};
const struct WindowTemplate sWindowTemplates_0855D2A8[] =
{
{2, 0, 0, 0x20, 0x20, 0, 1},
DUMMY_WIN_TEMPLATE
};
+70 -4
View File
@@ -1,8 +1,12 @@
#include "global.h"
#include "pokemon.h"
#include "rng.h"
#include "random.h"
#include "main.h"
#include "items.h"
#include "constants/species.h"
#include "constants/abilities.h"
#include "constants/items.h"
#include "constants/trainers.h"
#include "constants/moves.h"
#include "string_util.h"
#include "text.h"
@@ -14,6 +18,68 @@
extern u8 sav1_map_get_name(void);
// EWRAM vars
EWRAM_DATA u8 sLearningMoveTableID = 0;
EWRAM_DATA u8 gPlayerPartyCount = 0;
EWRAM_DATA u8 gEnemyPartyCount = 0;
EWRAM_DATA struct Pokemon gPlayerParty[PARTY_SIZE] = {0};
EWRAM_DATA struct Pokemon gEnemyParty[PARTY_SIZE] = {0};
// const rom data
const u16 gSpeciesToHoennPokedexNum[] = {203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 156, 157, 112, 113, 227, 228, 229, 230, 231, 232, 233, 234, 153, 154, 138, 139, 63, 64, 88, 89, 90, 235, 236, 237, 238, 239, 240, 241, 242, 158, 159, 243, 244, 245, 246, 247, 248, 249, 39, 40, 41, 73, 74, 75, 250, 251, 252, 66, 67, 57, 58, 59, 253, 254, 255, 256, 82, 83, 257, 92, 93, 258, 259, 106, 107, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 84, 85, 270, 271, 272, 273, 274, 275, 276, 108, 109, 169, 170, 277, 278, 279, 184, 185, 50, 51, 143, 144, 280, 281, 282, 283, 284, 167, 285, 52, 53, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 65, 181, 182, 155, 324, 137, 325, 326, 162, 163, 327, 328, 329, 91, 55, 56, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 161, 164, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 168, 357, 358, 359, 103, 104, 360, 361, 180, 362, 363, 364, 365, 115, 366, 367, 186, 165, 166, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 42, 43, 44, 25, 26, 34, 35, 114, 27, 28, 32, 33, 99, 100, 61, 62, 145, 131, 132, 60, 105, 68, 127, 128, 183, 129, 130, 140, 141, 97, 98, 116, 117, 118, 48, 49, 78, 79, 101, 102, 173, 174, 175, 119, 120, 171, 172, 125, 126, 54, 110, 111, 80, 81, 69, 76, 77, 121, 122, 160, 148, 149, 94, 36, 37, 38, 95, 96, 150, 45, 46, 47, 176, 177, 178, 152, 146, 147, 124, 123, 179, 70, 71, 72, 142, 86, 87, 133, 134, 135, 136, 29, 30, 31, 187, 188, 189, 190, 191, 192, 193, 194, 195, 198, 199, 200, 196, 197, 201, 202, 151};
const u16 gSpeciesToNationalPokedexNum[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 290, 291, 292, 276, 277, 285, 286, 327, 278, 279, 283, 284, 320, 321, 300, 301, 352, 343, 344, 299, 324, 302, 339, 340, 370, 341, 342, 349, 350, 318, 319, 328, 329, 330, 296, 297, 309, 310, 322, 323, 363, 364, 365, 331, 332, 361, 362, 337, 338, 298, 325, 326, 311, 312, 303, 307, 308, 333, 334, 360, 355, 356, 315, 287, 288, 289, 316, 317, 357, 293, 294, 295, 366, 367, 368, 359, 353, 354, 336, 335, 369, 304, 305, 306, 351, 313, 314, 345, 346, 347, 348, 280, 281, 282, 371, 372, 373, 374, 375, 376, 377, 378, 379, 382, 383, 384, 380, 381, 385, 386, 358};
const u16 gHoennToNationalOrder[] = {252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 63, 64, 65, 290, 291, 292, 293, 294, 295, 296, 297, 118, 119, 129, 130, 298, 183, 184, 74, 75, 76, 299, 300, 301, 41, 42, 169, 72, 73, 302, 303, 304, 305, 306, 66, 67, 68, 307, 308, 309, 310, 311, 312, 81, 82, 100, 101, 313, 314, 43, 44, 45, 182, 84, 85, 315, 316, 317, 318, 319, 320, 321, 322, 323, 218, 219, 324, 88, 89, 109, 110, 325, 326, 27, 28, 327, 227, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 174, 39, 40, 349, 350, 351, 120, 121, 352, 353, 354, 355, 356, 357, 358, 359, 37, 38, 172, 25, 26, 54, 55, 360, 202, 177, 178, 203, 231, 232, 127, 214, 111, 112, 361, 362, 363, 364, 365, 366, 367, 368, 369, 222, 170, 171, 370, 116, 117, 230, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 29, 30, 31, 32, 33, 34, 35, 36, 46, 47, 48, 49, 50, 51, 52, 53, 56, 57, 58, 59, 60, 61, 62, 69, 70, 71, 77, 78, 79, 80, 83, 86, 87, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 102, 103, 104, 105, 106, 107, 108, 113, 114, 115, 122, 123, 124, 125, 126, 128, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 173, 175, 176, 179, 180, 181, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 215, 216, 217, 220, 221, 223, 224, 225, 226, 228, 229, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411};
const struct SpindaSpot gSpindaSpotGraphics[] =
{
{16, 7, INCBIN_U16("graphics/spinda_spots/spot_0.bin")},
{40, 8, INCBIN_U16("graphics/spinda_spots/spot_1.bin")},
{22, 25, INCBIN_U16("graphics/spinda_spots/spot_2.bin")},
{34, 26, INCBIN_U16("graphics/spinda_spots/spot_3.bin")}
};
#include "data/pokemon/item_effects.h"
const s8 gNatureStatTable[][5] =
{
// Atk Def Spd Sp.Atk Sp.Def
{ 0, 0, 0, 0, 0}, // Hardy
{ +1, -1, 0, 0, 0}, // Lonely
{ +1, 0, -1, 0, 0}, // Brave
{ +1, 0, 0, -1, 0}, // Adamant
{ +1, 0, 0, 0, -1}, // Naughty
{ -1, +1, 0, 0, 0}, // Bold
{ 0, 0, 0, 0, 0}, // Docile
{ 0, +1, -1, 0, 0}, // Relaxed
{ 0, +1, 0, -1, 0}, // Impish
{ 0, +1, 0, 0, -1}, // Lax
{ -1, 0, +1, 0, 0}, // Timid
{ 0, -1, +1, 0, 0}, // Hasty
{ 0, 0, 0, 0, 0}, // Serious
{ 0, 0, +1, -1, 0}, // Jolly
{ 0, 0, +1, 0, -1}, // Naive
{ -1, 0, 0, +1, 0}, // Modest
{ 0, -1, 0, +1, 0}, // Mild
{ 0, 0, -1, +1, 0}, // Quiet
{ 0, 0, 0, 0, 0}, // Bashful
{ 0, 0, 0, +1, -1}, // Rash
{ -1, 0, 0, 0, +1}, // Calm
{ 0, -1, 0, 0, +1}, // Gentle
{ 0, 0, -1, 0, +1}, // Sassy
{ 0, 0, 0, -1, +1}, // Careful
{ 0, 0, 0, 0, 0}, // Quirky
};
#include "data/pokemon/tmhm_learnsets.h"
#include "data/pokemon/trainer_class_lookups.h"
#include "data/pokemon/cry_ids.h"
#include "data/pokemon/experience_tables.h"
#include "data/pokemon/base_stats.h"
#include "data/pokemon/level_up_learnsets.h"
#include "data/pokemon/evolution.h"
#include "data/pokemon/level_up_learnset_pointers.h"
// code
void ZeroBoxMonData(struct BoxPokemon *boxMon)
{
u8 *raw = (u8 *)boxMon;
@@ -43,14 +109,14 @@ void ZeroMonData(struct Pokemon *mon)
void ZeroPlayerPartyMons(void)
{
s32 i;
for (i = 0; i < 6; i++)
for (i = 0; i < PARTY_SIZE; i++)
ZeroMonData(&gPlayerParty[i]);
}
void ZeroEnemyPartyMons(void)
{
s32 i;
for (i = 0; i < 6; i++)
for (i = 0; i < PARTY_SIZE; i++)
ZeroMonData(&gEnemyParty[i]);
}
+37 -37
View File
@@ -2,9 +2,9 @@
#include "pokemon.h"
#include "battle.h"
#include "event_data.h"
#include "rng.h"
#include "random.h"
#include "sprite.h"
#include "species.h"
#include "constants/species.h"
#include "text.h"
#include "string_util.h"
@@ -14,10 +14,10 @@ struct Unknown_020249B4
struct SpriteTemplate* templates;
};
extern u8 gAbsentBankFlags;
extern u8 gActiveBank;
extern u8 gBankAttacker;
extern u8 gBankTarget;
extern u8 gAbsentBattlerFlags;
extern u8 gActiveBattler;
extern u8 gBattlerAttacker;
extern u8 gBattlerTarget;
extern u8 gLastUsedAbility;
extern u16 gTrainerBattleOpponent_A;
extern u32 gBattleTypeFlags;
@@ -34,9 +34,9 @@ extern const union AnimCmd* const * const gUnknown_0830536C[];
extern const u8 gText_BadEgg[];
extern const u8 gText_EggNickname[];
extern u8 GetBankSide(u8 bank);
extern u8 GetBankByIdentity(u8 bank);
extern u8 GetBankIdentity(u8 bank);
extern u8 GetBattlerSide(u8 bank);
extern u8 GetBattlerAtPosition(u8 bank);
extern u8 GetBattlerPosition(u8 bank);
u8 CountAliveMonsInBattle(u8 caseId)
{
@@ -48,21 +48,21 @@ u8 CountAliveMonsInBattle(u8 caseId)
case BATTLE_ALIVE_EXCEPT_ACTIVE:
for (i = 0; i < 4; i++)
{
if (i != gActiveBank && !(gAbsentBankFlags & gBitTable[i]))
if (i != gActiveBattler && !(gAbsentBattlerFlags & gBitTable[i]))
retVal++;
}
break;
case BATTLE_ALIVE_ATK_SIDE:
for (i = 0; i < 4; i++)
{
if (GetBankSide(i) == GetBankSide(gBankAttacker) && !(gAbsentBankFlags & gBitTable[i]))
if (GetBattlerSide(i) == GetBattlerSide(gBattlerAttacker) && !(gAbsentBattlerFlags & gBitTable[i]))
retVal++;
}
break;
case BATTLE_ALIVE_DEF_SIDE:
for (i = 0; i < 4; i++)
{
if (GetBankSide(i) == GetBankSide(gBankTarget) && !(gAbsentBankFlags & gBitTable[i]))
if (GetBattlerSide(i) == GetBattlerSide(gBattlerTarget) && !(gAbsentBattlerFlags & gBitTable[i]))
retVal++;
}
break;
@@ -75,7 +75,7 @@ bool8 ShouldGetStatBadgeBoost(u16 badgeFlag, u8 bank)
{
if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_x2000000 | BATTLE_TYPE_FRONTIER))
return FALSE;
if (GetBankSide(bank) != SIDE_PLAYER)
if (GetBattlerSide(bank) != B_SIDE_PLAYER)
return FALSE;
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gTrainerBattleOpponent_A == SECRET_BASE_OPPONENT)
return FALSE;
@@ -86,11 +86,11 @@ bool8 ShouldGetStatBadgeBoost(u16 badgeFlag, u8 bank)
u8 GetDefaultMoveTarget(u8 bank)
{
u8 status = GetBankIdentity(bank) & 1;
u8 status = GetBattlerPosition(bank) & 1;
status ^= 1;
if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
return GetBankByIdentity(status);
return GetBattlerAtPosition(status);
if (CountAliveMonsInBattle(BATTLE_ALIVE_EXCEPT_ACTIVE) > 1)
{
u8 val;
@@ -99,14 +99,14 @@ u8 GetDefaultMoveTarget(u8 bank)
val = status ^ 2;
else
val = status;
return GetBankByIdentity(val);
return GetBattlerAtPosition(val);
}
else
{
if ((gAbsentBankFlags & gBitTable[status]))
return GetBankByIdentity(status ^ 2);
if ((gAbsentBattlerFlags & gBitTable[status]))
return GetBattlerAtPosition(status ^ 2);
else
return GetBankByIdentity(status);
return GetBattlerAtPosition(status);
}
}
@@ -332,7 +332,7 @@ u32 GetMonData(struct Pokemon *mon, s32 field, u8* data)
ret = mon->defense;
break;
case MON_DATA_SPEED:
ret = GetDeoxysStat(mon, STAT_SPD);
ret = GetDeoxysStat(mon, STAT_SPEED);
if (!ret)
ret = mon->speed;
break;
@@ -1087,10 +1087,10 @@ u8 SendMonToPC(struct Pokemon* mon)
{
MonRestorePP(mon);
CopyMon(checkingMon, &mon->box, sizeof(mon->box));
gSpecialVar_0x8012 = boxNo;
gSpecialVar_0x8013 = boxPos;
gSpecialVar_MonBoxId = boxNo;
gSpecialVar_MonBoxPos = boxPos;
if (get_unknown_box_id() != boxNo)
FlagClear(SYS_STORAGE_UNKNOWN_FLAG);
FlagClear(FLAG_SYS_STORAGE_UNKNOWN_FLAG);
VarSet(VAR_STORAGE_UNKNOWN, boxNo);
return MON_GIVEN_TO_PC;
}
@@ -1155,7 +1155,7 @@ u8 GetMonsStateToDoubles_2(void)
s32 aliveCount = 0;
s32 i;
for (i = 0; i < 6; i++)
for (i = 0; i < PARTY_SIZE; i++)
{
u32 species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL);
if (species != SPECIES_EGG && species != SPECIES_NONE
@@ -1197,45 +1197,45 @@ void CreateSecretBaseEnemyParty(struct SecretBaseRecord *secretBaseRecord)
for (i = 0; i < PARTY_SIZE; i++)
{
if (gBattleResources->secretBase->partySpecies[i])
if (gBattleResources->secretBase->party.species[i])
{
CreateMon(&gEnemyParty[i],
gBattleResources->secretBase->partySpecies[i],
gBattleResources->secretBase->partyLevels[i],
gBattleResources->secretBase->party.species[i],
gBattleResources->secretBase->party.levels[i],
15,
1,
gBattleResources->secretBase->partyPersonality[i],
gBattleResources->secretBase->party.personality[i],
2,
0);
SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleResources->secretBase->partyHeldItems[i]);
SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleResources->secretBase->party.heldItems[i]);
for (j = 0; j < 6; j++)
SetMonData(&gEnemyParty[i], MON_DATA_HP_EV + j, &gBattleResources->secretBase->partyEVs[i]);
SetMonData(&gEnemyParty[i], MON_DATA_HP_EV + j, &gBattleResources->secretBase->party.EVs[i]);
for (j = 0; j < 4; j++)
{
SetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j, &gBattleResources->secretBase->partyMoves[i * 4 + j]);
SetMonData(&gEnemyParty[i], MON_DATA_PP1 + j, &gBattleMoves[gBattleResources->secretBase->partyMoves[i * 4 + j]].pp);
SetMonData(&gEnemyParty[i], MON_DATA_MOVE1 + j, &gBattleResources->secretBase->party.moves[i * 4 + j]);
SetMonData(&gEnemyParty[i], MON_DATA_PP1 + j, &gBattleMoves[gBattleResources->secretBase->party.moves[i * 4 + j]].pp);
}
}
}
}
extern const u8 gUnknown_0831F578[];
extern const u8 gTrainerClassToNameIndex[];
extern const u8 gFacilityClassToPicIndex[];
extern const u8 gFacilityClassToTrainerClass[];
extern const u8 gSecretBaseTrainerClasses[][5];
u8 GetSecretBaseTrainerPicIndex(void)
{
u8 trainerClass = gSecretBaseTrainerClasses[gBattleResources->secretBase->gender][gBattleResources->secretBase->trainerId[0] % 5];
return gUnknown_0831F578[trainerClass];
return gFacilityClassToPicIndex[trainerClass];
}
u8 GetSecretBaseTrainerNameIndex(void)
{
u8 trainerClass = gSecretBaseTrainerClasses[gBattleResources->secretBase->gender][gBattleResources->secretBase->trainerId[0] % 5];
return gTrainerClassToNameIndex[trainerClass];
return gFacilityClassToTrainerClass[trainerClass];
}
bool8 IsPlayerPartyAndPokemonStorageFull(void)
@@ -1353,7 +1353,7 @@ void CopyPlayerPartyMonToBattleData(u8 bank, u8 partyIndex)
StringCopy10(gBattleMons[bank].nickname, nickname);
GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_NAME, gBattleMons[bank].otName);
hpSwitchout = &gBattleStruct->hpOnSwitchout[GetBankSide(bank)];
hpSwitchout = &gBattleStruct->hpOnSwitchout[GetBattlerSide(bank)];
*hpSwitchout = gBattleMons[bank].hp;
for (i = 0; i < 8; i++)
+111 -111
View File
@@ -1,39 +1,39 @@
#include "global.h"
#include "pokemon.h"
#include "main.h"
#include "items.h"
#include "constants/items.h"
#include "string_util.h"
#include "battle_message.h"
#include "rtc.h"
#include "item.h"
#include "battle.h"
#include "species.h"
#include "constants/species.h"
#include "link.h"
#include "hold_effects.h"
#include "rng.h"
#include "trainer_classes.h"
#include "trainer_ids.h"
#include "songs.h"
#include "constants/hold_effects.h"
#include "random.h"
#include "constants/trainers.h"
#include "constants/songs.h"
#include "sound.h"
#include "m4a.h"
#include "task.h"
#include "sprite.h"
#include "text.h"
#include "abilities.h"
#include "constants/abilities.h"
#include "pokemon_animation.h"
#include "pokedex.h"
#include "pokeblock.h"
extern struct BattlePokemon gBattleMons[4];
extern struct BattleEnigmaBerry gEnigmaBerries[4];
extern u8 gActiveBank;
extern u8 gBankInMenu;
extern u8 gBankTarget;
extern u8 gBankAttacker;
extern u8 gStringBank;
extern u8 gActiveBattler;
extern u8 gBattlerInMenuId;
extern u8 gBattlerTarget;
extern u8 gBattlerAttacker;
extern u8 gPotentialItemEffectBattler;
extern u16 gTrainerBattleOpponent_A;
extern u32 gBattleTypeFlags;
extern u8 gBattleMonForms[4];
extern u16 gBattlePartyID[4];
extern u16 gBattlerPartyIndexes[4];
extern u8 gLastUsedAbility;
extern u16 gPartnerTrainerId;
extern u32 gHitMarker;
@@ -59,7 +59,6 @@ extern const u8 gText_PkmnsXPreventsSwitching[];
extern const struct CompressedSpritePalette gMonPaletteTable[];
extern const struct CompressedSpritePalette gMonShinyPaletteTable[];
extern const u16 gHMMoves[];
extern const s8 gPokeblockFlavorCompatibilityTable[];
extern const u8 gMonAnimationDelayTable[];
extern const u8 gMonFrontAnimIdsTable[];
@@ -75,8 +74,6 @@ extern u8 GetFrontierOpponentClass(u16 trainerId);
extern u8 pokemon_order_func(u8 bankPartyId);
extern void GetFrontierTrainerName(u8* dest, u16 trainerId);
extern void sub_81C488C(u8);
extern void sub_817F578(struct Sprite*, u8 frontAnimId);
extern u8 GetSpeciesBackAnimId(u16 species);
static void sub_806E6CC(u8 taskId);
@@ -116,7 +113,7 @@ u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit)
if (itemId == ITEM_ENIGMA_BERRY)
{
temp = gEnigmaBerries[gActiveBank].itemEffect;
temp = gEnigmaBerries[gActiveBattler].itemEffect;
}
itemEffect = temp;
@@ -213,7 +210,7 @@ u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit)
void sub_806CF24(s32 stat)
{
gBankTarget = gBankInMenu;
gBattlerTarget = gBattlerInMenuId;
StringCopy(gBattleTextBuff1, gStatNamesTable[gUnknown_08329EC8[stat]]);
StringCopy(gBattleTextBuff2, gText_StatRose);
BattleStringExpandPlaceholdersToDisplayedString(gText_PkmnsStatChanged2);
@@ -227,7 +224,7 @@ u8 *sub_806CF78(u16 itemId)
if (itemId == ITEM_ENIGMA_BERRY)
{
if (gMain.inBattle)
itemEffect = gEnigmaBerries[gBankInMenu].itemEffect;
itemEffect = gEnigmaBerries[gBattlerInMenuId].itemEffect;
else
itemEffect = gSaveBlock1Ptr->enigmaBerry.itemEffect;
}
@@ -236,7 +233,7 @@ u8 *sub_806CF78(u16 itemId)
itemEffect = gItemEffectTable[itemId - 13];
}
gStringBank = gBankInMenu;
gPotentialItemEffectBattler = gBattlerInMenuId;
for (i = 0; i < 3; i++)
{
@@ -250,7 +247,7 @@ u8 *sub_806CF78(u16 itemId)
}
else
{
gBankAttacker = gBankInMenu;
gBattlerAttacker = gBattlerInMenuId;
BattleStringExpandPlaceholdersToDisplayedString(gText_PkmnGettingPumped);
}
}
@@ -258,7 +255,7 @@ u8 *sub_806CF78(u16 itemId)
if (itemEffect[3] & 0x80)
{
gBankAttacker = gBankInMenu;
gBattlerAttacker = gBattlerInMenuId;
BattleStringExpandPlaceholdersToDisplayedString(gText_PkmnShroudedInMist);
}
@@ -304,56 +301,56 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem)
for (i = 0; i < 5; i++)
{
switch (gEvolutionTable[species].evolutions[i].method)
switch (gEvolutionTable[species][i].method)
{
case EVO_FRIENDSHIP:
if (friendship >= 220)
targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
targetSpecies = gEvolutionTable[species][i].targetSpecies;
break;
case EVO_FRIENDSHIP_DAY:
RtcCalcLocalTime();
if (gLocalTime.hours >= 12 && gLocalTime.hours < 24 && friendship >= 220)
targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
targetSpecies = gEvolutionTable[species][i].targetSpecies;
break;
case EVO_FRIENDSHIP_NIGHT:
RtcCalcLocalTime();
if (gLocalTime.hours >= 0 && gLocalTime.hours < 12 && friendship >= 220)
targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
targetSpecies = gEvolutionTable[species][i].targetSpecies;
break;
case EVO_LEVEL:
if (gEvolutionTable[species].evolutions[i].param <= level)
targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
if (gEvolutionTable[species][i].param <= level)
targetSpecies = gEvolutionTable[species][i].targetSpecies;
break;
case EVO_LEVEL_ATK_GT_DEF:
if (gEvolutionTable[species].evolutions[i].param <= level)
if (gEvolutionTable[species][i].param <= level)
if (GetMonData(mon, MON_DATA_ATK, 0) > GetMonData(mon, MON_DATA_DEF, 0))
targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
targetSpecies = gEvolutionTable[species][i].targetSpecies;
break;
case EVO_LEVEL_ATK_EQ_DEF:
if (gEvolutionTable[species].evolutions[i].param <= level)
if (gEvolutionTable[species][i].param <= level)
if (GetMonData(mon, MON_DATA_ATK, 0) == GetMonData(mon, MON_DATA_DEF, 0))
targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
targetSpecies = gEvolutionTable[species][i].targetSpecies;
break;
case EVO_LEVEL_ATK_LT_DEF:
if (gEvolutionTable[species].evolutions[i].param <= level)
if (gEvolutionTable[species][i].param <= level)
if (GetMonData(mon, MON_DATA_ATK, 0) < GetMonData(mon, MON_DATA_DEF, 0))
targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
targetSpecies = gEvolutionTable[species][i].targetSpecies;
break;
case EVO_LEVEL_SILCOON:
if (gEvolutionTable[species].evolutions[i].param <= level && (upperPersonality % 10) <= 4)
targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
if (gEvolutionTable[species][i].param <= level && (upperPersonality % 10) <= 4)
targetSpecies = gEvolutionTable[species][i].targetSpecies;
break;
case EVO_LEVEL_CASCOON:
if (gEvolutionTable[species].evolutions[i].param <= level && (upperPersonality % 10) > 4)
targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
if (gEvolutionTable[species][i].param <= level && (upperPersonality % 10) > 4)
targetSpecies = gEvolutionTable[species][i].targetSpecies;
break;
case EVO_LEVEL_NINJASK:
if (gEvolutionTable[species].evolutions[i].param <= level)
targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
if (gEvolutionTable[species][i].param <= level)
targetSpecies = gEvolutionTable[species][i].targetSpecies;
break;
case EVO_BEAUTY:
if (gEvolutionTable[species].evolutions[i].param <= beauty)
targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
if (gEvolutionTable[species][i].param <= beauty)
targetSpecies = gEvolutionTable[species][i].targetSpecies;
break;
}
}
@@ -361,17 +358,17 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem)
case 1:
for (i = 0; i < 5; i++)
{
switch (gEvolutionTable[species].evolutions[i].method)
switch (gEvolutionTable[species][i].method)
{
case EVO_TRADE:
targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
targetSpecies = gEvolutionTable[species][i].targetSpecies;
break;
case EVO_TRADE_ITEM:
if (gEvolutionTable[species].evolutions[i].param == heldItem)
if (gEvolutionTable[species][i].param == heldItem)
{
heldItem = 0;
SetMonData(mon, MON_DATA_HELD_ITEM, (u8 *)&heldItem);
targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
targetSpecies = gEvolutionTable[species][i].targetSpecies;
}
break;
}
@@ -381,10 +378,10 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem)
case 3:
for (i = 0; i < 5; i++)
{
if (gEvolutionTable[species].evolutions[i].method == EVO_ITEM
&& gEvolutionTable[species].evolutions[i].param == evolutionItem)
if (gEvolutionTable[species][i].method == EVO_ITEM
&& gEvolutionTable[species][i].param == evolutionItem)
{
targetSpecies = gEvolutionTable[species].evolutions[i].targetSpecies;
targetSpecies = gEvolutionTable[species][i].targetSpecies;
break;
}
}
@@ -618,7 +615,7 @@ bool16 sub_806D82C(u8 id)
return retVal;
}
s32 GetBankMultiplayerId(u16 a1)
s32 GetBattlerMultiplayerId(u16 a1)
{
s32 id;
for (id = 0; id < MAX_LINK_PLAYERS; id++)
@@ -692,9 +689,9 @@ void AdjustFriendship(struct Pokemon *mon, u8 event)
if ((event != 5 || !(Random() & 1))
&& (event != 3
|| ((gBattleTypeFlags & BATTLE_TYPE_TRAINER)
&& (gTrainers[gTrainerBattleOpponent_A].trainerClass == CLASS_ELITE_FOUR
|| gTrainers[gTrainerBattleOpponent_A].trainerClass == CLASS_LEADER
|| gTrainers[gTrainerBattleOpponent_A].trainerClass == CLASS_CHAMPION))))
&& (gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_ELITE_FOUR
|| gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_LEADER
|| gTrainers[gTrainerBattleOpponent_A].trainerClass == TRAINER_CLASS_CHAMPION))))
{
s8 mod = gUnknown_08329ECE[event][friendshipLevel];
if (mod > 0 && holdEffect == HOLD_EFFECT_HAPPINESS_UP)
@@ -1146,55 +1143,57 @@ void ClearBattleMonForms(void)
u16 GetBattleBGM(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON)
return 0x1E0;
return MUS_BATTLE34;
if (gBattleTypeFlags & BATTLE_TYPE_REGI)
return 0x1DF;
return MUS_BATTLE36;
if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_x2000000))
return 0x1DC;
return MUS_BATTLE20;
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
{
u8 trainerClass;
if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
trainerClass = GetFrontierOpponentClass(gTrainerBattleOpponent_A);
else if (gBattleTypeFlags & BATTLE_TYPE_x4000000)
trainerClass = CLASS_EXPERT;
trainerClass = TRAINER_CLASS_EXPERT;
else
trainerClass = gTrainers[gTrainerBattleOpponent_A].trainerClass;
switch (trainerClass)
{
case CLASS_AQUA_LEADER:
case CLASS_MAGMA_LEADER:
return 0x1E3;
case CLASS_TEAM_AQUA:
case CLASS_TEAM_MAGMA:
case CLASS_AQUA_ADMIN:
case CLASS_MAGMA_ADMIN:
return 0x1DB;
case CLASS_LEADER:
return 0x1DD;
case CLASS_CHAMPION:
return 0x1DE;
case CLASS_PKMN_TRAINER_RIVAL:
case TRAINER_CLASS_AQUA_LEADER:
case TRAINER_CLASS_MAGMA_LEADER:
return MUS_BATTLE30;
case TRAINER_CLASS_TEAM_AQUA:
case TRAINER_CLASS_TEAM_MAGMA:
case TRAINER_CLASS_AQUA_ADMIN:
case TRAINER_CLASS_MAGMA_ADMIN:
return MUS_BATTLE31;
case TRAINER_CLASS_LEADER:
return MUS_BATTLE32;
case TRAINER_CLASS_CHAMPION:
return MUS_BATTLE33;
case TRAINER_CLASS_PKMN_TRAINER_3:
if (gBattleTypeFlags & BATTLE_TYPE_FRONTIER)
return 0x1E1;
return MUS_BATTLE35;
if (!StringCompare(gTrainers[gTrainerBattleOpponent_A].trainerName, gText_BattleWallyName))
return 0x1DC;
return 0x1E1;
case CLASS_ELITE_FOUR:
return 0x1E2;
case CLASS_SALON_MAIDEN:
case CLASS_DOME_ACE:
case CLASS_PALACE_MAVEN:
case CLASS_ARENA_TYCOON:
case CLASS_FACTORY_HEAD:
case CLASS_PIKE_QUEEN:
case CLASS_PYRAMID_KING:
return 0x1D7;
return MUS_BATTLE20;
return MUS_BATTLE35;
case TRAINER_CLASS_ELITE_FOUR:
return MUS_BATTLE38;
case TRAINER_CLASS_SALON_MAIDEN:
case TRAINER_CLASS_DOME_ACE:
case TRAINER_CLASS_PALACE_MAVEN:
case TRAINER_CLASS_ARENA_TYCOON:
case TRAINER_CLASS_FACTORY_HEAD:
case TRAINER_CLASS_PIKE_QUEEN:
case TRAINER_CLASS_PYRAMID_KING:
return MUS_VS_FRONT;
default:
return 0x1DC;
return MUS_BATTLE20;
}
}
return 0x1DA;
return MUS_BATTLE27;
}
void PlayBattleBGM(void)
@@ -1234,12 +1233,12 @@ static void sub_806E6CC(u8 taskId)
DestroyTask(taskId);
}
const u8 *pokemon_get_pal(struct Pokemon *mon)
const u8 *GetMonFrontSpritePal(struct Pokemon *mon)
{
u16 species = GetMonData(mon, MON_DATA_SPECIES2, 0);
u32 otId = GetMonData(mon, MON_DATA_OT_ID, 0);
u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0);
return species_and_otid_get_pal(species, otId, personality);
return GetFrontSpritePalFromSpeciesAndPersonality(species, otId, personality);
}
// Extracts the upper 16 bits of a 32-bit number
@@ -1248,7 +1247,7 @@ const u8 *pokemon_get_pal(struct Pokemon *mon)
// Extracts the lower 16 bits of a 32-bit number
#define LOHALF(n) ((n) & 0xFFFF)
const u8 *species_and_otid_get_pal(u16 species, u32 otId, u32 personality)
const u8 *GetFrontSpritePalFromSpeciesAndPersonality(u16 species, u32 otId, u32 personality)
{
u32 shinyValue;
@@ -1297,21 +1296,21 @@ bool8 IsPokeSpriteNotFlipped(u16 species)
return gBaseStats[species].noFlip;
}
s8 GetMonFlavourRelation(struct Pokemon *mon, u8 a2)
s8 GetMonFlavorRelation(struct Pokemon *mon, u8 flavor)
{
u8 nature = GetNature(mon);
return gPokeblockFlavorCompatibilityTable[nature * 5 + a2];
return gPokeblockFlavorCompatibilityTable[nature * 5 + flavor];
}
s8 GetFlavourRelationByPersonality(u32 personality, u8 a2)
s8 GetFlavorRelationByPersonality(u32 personality, u8 flavor)
{
u8 nature = GetNatureFromPersonality(personality);
return gPokeblockFlavorCompatibilityTable[nature * 5 + a2];
return gPokeblockFlavorCompatibilityTable[nature * 5 + flavor];
}
bool8 IsTradedMon(struct Pokemon *mon)
{
u8 otName[8];
u8 otName[OT_NAME_LENGTH + 1];
u32 otId;
GetMonData(mon, MON_DATA_OT_NAME, otName);
otId = GetMonData(mon, MON_DATA_OT_ID, 0);
@@ -1367,12 +1366,12 @@ void sub_806E994(void)
gBattleTextBuff1[2] = gBattleStruct->field_49;
gBattleTextBuff1[4] = B_BUFF_EOS;
if (!GetBankSide(gBattleStruct->field_49))
gBattleTextBuff1[3] = pokemon_order_func(gBattlePartyID[gBattleStruct->field_49]);
if (!GetBattlerSide(gBattleStruct->field_49))
gBattleTextBuff1[3] = pokemon_order_func(gBattlerPartyIndexes[gBattleStruct->field_49]);
else
gBattleTextBuff1[3] = gBattlePartyID[gBattleStruct->field_49];
gBattleTextBuff1[3] = gBattlerPartyIndexes[gBattleStruct->field_49];
PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff2, gBankInMenu, pokemon_order_func(gBattlePartyID[gBankInMenu]))
PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff2, gBattlerInMenuId, pokemon_order_func(gBattlerPartyIndexes[gBattlerInMenuId]))
BattleStringExpandPlaceholders(gText_PkmnsXPreventsSwitching, gStringVar4);
}
@@ -1396,7 +1395,7 @@ static s32 GetWildMonTableIdInAlteringCave(u16 species)
void SetWildMonHeldItem(void)
{
if (!(gBattleTypeFlags & (BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_TRAINER | BATTLE_TYPE_PYRAMID | BATTLE_TYPE_x100000)))
if (!(gBattleTypeFlags & (BATTLE_TYPE_LEGENDARY | BATTLE_TYPE_TRAINER | BATTLE_TYPE_PYRAMID | BATTLE_TYPE_PIKE)))
{
u16 rnd = Random() % 100;
u16 species = GetMonData(&gEnemyParty[0], MON_DATA_SPECIES, 0);
@@ -1462,12 +1461,14 @@ bool8 IsShinyOtIdPersonality(u32 otId, u32 personality)
return retVal;
}
const u8* GetTrainerPartnerName(void)
const u8 *GetTrainerPartnerName(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER)
{
if (gPartnerTrainerId == STEVEN_PARTNER_ID)
return gTrainers[TRAINER_ID_STEVEN].trainerName;
{
return gTrainers[TRAINER_STEVEN].trainerName;
}
else
{
GetFrontierTrainerName(gStringVar1, gPartnerTrainerId);
@@ -1477,7 +1478,7 @@ const u8* GetTrainerPartnerName(void)
else
{
u8 id = GetMultiplayerId();
return gLinkPlayers[GetBankMultiplayerId(gLinkPlayers[id].lp_field_18 ^ 2)].name;
return gLinkPlayers[GetBattlerMultiplayerId(gLinkPlayers[id].lp_field_18 ^ 2)].name;
}
}
@@ -1505,7 +1506,7 @@ static void Task_PokemonSummaryAnimateAfterDelay(u8 taskId)
{
if (--gTasks[taskId].data[3] == 0)
{
sub_817F578(READ_PTR_FROM_TASK(taskId, 0), gTasks[taskId].data[2]);
StartMonSummaryAnimation(READ_PTR_FROM_TASK(taskId, 0), gTasks[taskId].data[2]);
sub_81C488C(0xFF);
DestroyTask(taskId);
}
@@ -1520,7 +1521,6 @@ void BattleAnimateFrontSprite(struct Sprite* sprite, u16 species, bool8 noCry, u
}
extern void SpriteCallbackDummy_2(struct Sprite*);
extern void sub_817F60C(struct Sprite*);
void DoMonFrontSpriteAnimation(struct Sprite* sprite, u16 species, bool8 noCry, u8 arg3)
{
@@ -1577,11 +1577,11 @@ void PokemonSummaryDoMonAnimation(struct Sprite* sprite, u16 species, bool8 oneF
gTasks[taskId].data[2] = gMonFrontAnimIdsTable[species - 1];
gTasks[taskId].data[3] = gMonAnimationDelayTable[species - 1];
sub_81C488C(taskId);
sub_817F60C(sprite);
SetSpriteCB_MonAnimDummy(sprite);
}
else
{
sub_817F578(sprite, gMonFrontAnimIdsTable[species - 1]);
StartMonSummaryAnimation(sprite, gMonFrontAnimIdsTable[species - 1]);
}
}
@@ -1600,7 +1600,7 @@ void BattleAnimateBackSprite(struct Sprite* sprite, u16 species)
}
else
{
LaunchAnimationTaskForBackSprite(sprite, GetSpeciesBackAnimId(species));
LaunchAnimationTaskForBackSprite(sprite, GetSpeciesBackAnimSet(species));
sprite->callback = SpriteCallbackDummy_2;
}
}
@@ -1652,11 +1652,11 @@ u8 sub_806EF84(u8 arg0, u8 arg1)
return i;
}
extern const u8 gUnknown_0831F578[];
extern const u8 gFacilityClassToPicIndex[];
u16 sub_806EFF0(u16 arg0)
{
return gUnknown_0831F578[arg0];
return gFacilityClassToPicIndex[arg0];
}
u16 PlayerGenderToFrontTrainerPicId(u8 playerGender)
@@ -1682,14 +1682,14 @@ void HandleSetPokedexFlag(u16 nationalNum, u8 caseId, u32 personality)
}
}
const u8* GetTrainerClassNameFromId(u16 trainerId)
const u8 *GetTrainerClassNameFromId(u16 trainerId)
{
if (trainerId > NO_OF_TRAINERS)
trainerId = 0;
return gTrainerClassNames[gTrainers[trainerId].trainerClass];
}
const u8* GetTrainerNameFromId(u16 trainerId)
const u8 *GetTrainerNameFromId(u16 trainerId)
{
if (trainerId > NO_OF_TRAINERS)
trainerId = 0;
File diff suppressed because it is too large Load Diff
+1014
View File
File diff suppressed because it is too large Load Diff
+6 -6
View File
@@ -1,7 +1,7 @@
#include "global.h"
#include "pokemon_size_record.h"
#include "event_data.h"
#include "species.h"
#include "constants/species.h"
#include "string_util.h"
#include "text.h"
#include "pokemon.h"
@@ -109,13 +109,13 @@ static void FormatMonSizeRecord(u8 *string, u32 size)
static u8 CompareMonSize(u16 species, u16 *sizeRecord)
{
if (gScriptResult == 0xFF)
if (gSpecialVar_Result == 0xFF)
{
return 0;
}
else
{
struct Pokemon *pkmn = &gPlayerParty[gScriptResult];
struct Pokemon *pkmn = &gPlayerParty[gSpecialVar_Result];
if (GetMonData(pkmn, MON_DATA_IS_EGG) == TRUE || GetMonData(pkmn, MON_DATA_SPECIES) != species)
{
@@ -173,7 +173,7 @@ void CompareSeedotSize(void)
{
u16 *sizeRecord = GetVarPointer(VAR_SEEDOT_SIZE_RECORD);
gScriptResult = CompareMonSize(SPECIES_SEEDOT, sizeRecord);
gSpecialVar_Result = CompareMonSize(SPECIES_SEEDOT, sizeRecord);
}
void InitLotadSizeRecord(void)
@@ -192,7 +192,7 @@ void CompareLotadSize(void)
{
u16 *sizeRecord = GetVarPointer(VAR_LOTAD_SIZE_RECORD);
gScriptResult = CompareMonSize(SPECIES_LOTAD, sizeRecord);
gSpecialVar_Result = CompareMonSize(SPECIES_LOTAD, sizeRecord);
}
void GiveGiftRibbonToParty(u8 index, u8 ribbonId)
@@ -217,6 +217,6 @@ void GiveGiftRibbonToParty(u8 index, u8 ribbonId)
}
}
if (gotRibbon)
FlagSet(SYS_RIBBON_GET);
FlagSet(FLAG_SYS_RIBBON_GET);
}
}
+183 -9
View File
@@ -1,15 +1,189 @@
// Includes
#include "global.h"
// Static type declarations
// Static RAM declarations
#include "pokemon_storage_system.h"
#include "pokemon.h"
#include "constants/species.h"
#include "event_data.h"
#include "string_util.h"
#include "text.h"
#include "strings.h"
#include "window.h"
IWRAM_DATA u8 gUnknown_03000F78[0x188];
// Static ROM declarations
struct OptionAndDescription
{
const u8 *optionTxt;
const u8 *descriptionTxt;
};
// .rodata
// const rom data
const struct OptionAndDescription gUnknown_085716C0[] =
{
{gText_WithdrawPokemon, gText_WithdrawMonDescription},
{gText_DepositPokemon, gText_DepositMonDescription},
{gText_MovePokemon, gText_MoveMonDescription},
{gText_MoveItems, gText_MoveItemsDescription},
{gText_SeeYa, gText_SeeYaDescription}
};
// .text
const struct WindowTemplate gUnknown_085716E8 = {0, 1, 1, 0x11, 0xA, 0xF, 1};
static const union AnimCmd sSpriteAnim_85716F0[] =
{
ANIMCMD_FRAME(0, 5),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_85716F8[] =
{
ANIMCMD_FRAME(4, 5),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_8571700[] =
{
ANIMCMD_FRAME(6, 5),
ANIMCMD_END
};
static const union AnimCmd sSpriteAnim_8571708[] =
{
ANIMCMD_FRAME(10, 5),
ANIMCMD_END
};
const union AnimCmd *const sSpriteAnimTable_8571710[] =
{
sSpriteAnim_85716F0,
sSpriteAnim_85716F8,
sSpriteAnim_8571700,
sSpriteAnim_8571708
};
static const union AffineAnimCmd sSpriteAffineAnim_8571720[] =
{
AFFINEANIMCMD_FRAME(0xE0, 0xE0, 0, 0),
AFFINEANIMCMD_END
};
static const union AffineAnimCmd *const sSpriteAffineAnimTable_8571730[] =
{
sSpriteAffineAnim_8571720
};
const u8 gUnknown_08571734[] = {4, 0xF, 0xE};
const u8 gUnknown_08571737[] = _("/30");
// code
u8 CountMonsInBox(u8 boxId)
{
u16 i, count;
for (i = 0, count = 0; i < IN_BOX_COUNT; i++)
{
if (GetBoxMonDataFromAnyBox(boxId, i, MON_DATA_SPECIES) != SPECIES_NONE)
count++;
}
return count;
}
s16 GetFirstFreeBoxSpot(u8 boxId)
{
u16 i;
for (i = 0; i < IN_BOX_COUNT; i++)
{
if (GetBoxMonDataFromAnyBox(boxId, i, MON_DATA_SPECIES) == SPECIES_NONE)
return i;
}
return -1; // all spots are taken
}
u8 CountPartyNonEggMons(void)
{
u16 i, count;
for (i = 0, count = 0; i < PARTY_SIZE; i++)
{
if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != SPECIES_NONE
&& !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG))
{
count++;
}
}
return count;
}
u8 CountPartyAliveNonEggMonsExcept(u8 slotToIgnore)
{
u16 i, count;
for (i = 0, count = 0; i < PARTY_SIZE; i++)
{
if (i != slotToIgnore
&& GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != SPECIES_NONE
&& !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)
&& GetMonData(&gPlayerParty[i], MON_DATA_HP) != 0)
{
count++;
}
}
return count;
}
u16 CountPartyAliveNonEggMons_IgnoreVar0x8004Slot(void)
{
return CountPartyAliveNonEggMonsExcept(gSpecialVar_0x8004);
}
u8 CountPartyMons(void)
{
u16 i, count;
for (i = 0, count = 0; i < PARTY_SIZE; i++)
{
if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != SPECIES_NONE)
{
count++;
}
}
return count;
}
static u8 *StringCopyAndFillWithSpaces(u8 *dst, const u8 *src, u16 n)
{
u8 *str;
for (str = StringCopy(dst, src); str < dst + n; str++)
*str = CHAR_SPACE;
*str = EOS;
return str;
}
/* can't match
static void sub_80C7128(u16 *dst, u16 dstToAdd, u16 dstToMul, const u16 *src, u16 srcToAdd, u16 srcToMul, u32 size, u16 count, u16 srcBy)
{
u16 i;
size <<= 0x11;
dst += (dstToMul * 32) + dstToAdd;
src += (srcToMul * srcBy) + srcToAdd;
i = 0;
if (i < count)
{
size >>= 1;
for (i = 0; i < count; i++)
{
CpuSet(src, dst, size >> 0x10);
dst += 0x20;
src += srcBy;
}
}
}*/
Executable → Regular
+67 -71
View File
@@ -3,22 +3,24 @@
#include "bg.h"
#include "decompress.h"
#include "item.h"
#include "items.h"
#include "constants/items.h"
#include "link.h"
#include "m4a.h"
#include "main.h"
#include "malloc.h"
#include "moves.h"
#include "constants/moves.h"
#include "palette.h"
#include "pokemon.h"
#include "songs.h"
#include "constants/songs.h"
#include "sound.h"
#include "species.h"
#include "constants/species.h"
#include "sprite.h"
#include "unk_text_util.h"
#include "string_util.h"
#include "task.h"
#include "text.h"
#include "window.h"
#include "event_data.h"
struct ContestMove
{
@@ -35,25 +37,22 @@ struct ContestEffect
u8 jam;
};
extern struct UnkSummaryStruct* gUnknown_0203CF1C;
extern struct BgTemplate gUnknown_0861CBB4;
extern u8 gUnknown_0203CF20;
extern struct MusicPlayerInfo gMPlay_BGM;
extern struct MusicPlayerInfo gMPlayInfo_BGM;
extern s8 gUnknown_0861CC1C[];
extern u8 gUnknown_08329D22[];
extern u8 gUnknown_0203CF21;
extern u16 gSpecialVar_0x8005;
extern struct UnkStruct_61CC04 gUnknown_0861CC04;
extern struct UnkStruct_61CC04 gUnknown_0861CC10;
extern struct UnkStruct_61CC04 gUnknown_0861CBEC;
extern struct UnkStruct_61CC04 gUnknown_0861CBF8;
extern u16 gUnknown_08DC3CD4[];
extern u16 gSummaryScreenWindow_Tilemap[];
extern struct ContestMove gContestMoves[];
extern struct ContestEffect gContestEffects[];
extern struct WindowTemplate gUnknown_0861CC24;
extern struct TextColor gUnknown_0861CD2C[];
extern u8 gUnknown_0861CD2C[][3];
extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1];
extern u8 gText_MaleSymbol[];
extern u8 gText_FemaleSymbol[];
@@ -72,9 +71,9 @@ extern void do_scheduled_bg_tilemap_copies_to_vram(void);
extern u8 sub_81221EC();
extern u8 sub_81221AC();
extern void SetVBlankHBlankCallbacksToNull();
extern void sub_8121DA0();
extern void ResetVramOamAndBgCntRegs();
extern void clear_scheduled_bg_copies_to_vram();
extern void remove_some_task();
extern void ScanlineEffect_Stop();
extern void ResetBgsAndClearDma3BusyFlags(u32 leftoverFireRedLeafGreenVariable);
extern void ShowBg(u8 a);
extern void SetGpuReg(u8 regOffset, u16 value);
@@ -92,12 +91,11 @@ extern struct CompressedSpriteSheet gUnknown_0861D074;
extern struct CompressedSpriteSheet gUnknown_0861D0F8;
extern struct CompressedSpritePalette gUnknown_0861D100;
extern struct CompressedSpritePalette gUnknown_0861D07C;
extern u8 gUnknown_08D97B84;
extern u8 gMoveTypes_Pal;
extern u8 gUnknown_08D97D0C;
extern void reset_temp_tile_data_buffers();
extern void decompress_and_copy_tile_data_to_vram(u8 a, void* tiledata, u8 b, u8 c, u8 d);
extern u8 free_temp_tile_data_buffers_if_possible();
extern void sub_8069004(struct BoxPokemon* a, void* b);
extern void sub_81C1E20(u8 taskId);
extern u8 *GetMonNickname(struct Pokemon *mon, u8 *dest);
extern u16 SpeciesToPokedexNum(u16 species);
@@ -162,14 +160,12 @@ extern struct BattleMove gBattleMoves[];
extern u32 ChangeBgX(u8 bg, u32 value, u8 op);
extern void sub_8199C30(u8 a, u8 b, u8 c, u8 d, u8 e, u8 f);
extern void AddTextPrinterParametrized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, struct TextColor* colors, s8 speed, u8 *str);
extern void AddTextPrinterParameterized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, const u8* colors, s8 speed, u8 *str);
extern s32 GetStringCenterAlignXOffset(u8 fontId, u8 *str, s32 totalWidth);
extern s32 GetStringRightAlignXOffset(u8 fontId, u8 *str, s32 totalWidth);
extern bool8 sub_81A6BF4();
extern bool8 sub_81B9E94();
extern void sub_81AFBF0();
extern u8 sub_81AFC0C(u8 a, u8 *b);
extern void sub_81AFC28(u8 *a, u8 *b);
extern void UnkTextUtil_Reset();
extern void sub_8124610(u8 *a, u8 b);
extern int GetPlayerIDAsU32();
extern u8 GetCurrentPpToMaxPpState(u8 a, u8 b);
@@ -195,7 +191,7 @@ void sub_81C4A88();
void sub_81C4280();
void sub_81C0510(u8 taskId);
void sub_81C171C(u8 taskId);
void sub_8121E10();
void ResetAllBgsCoordinates();
u8 sub_81B205C(struct Pokemon* a);
void sub_81C1DA4(u16 a, s16 b);
void sub_81C1EFC(u16 a, s16 b, u16 c);
@@ -452,12 +448,12 @@ bool8 sub_81BFB10(void)
{
case 0:
SetVBlankHBlankCallbacksToNull();
sub_8121DA0();
ResetVramOamAndBgCntRegs();
clear_scheduled_bg_copies_to_vram();
gMain.state++;
break;
case 1:
remove_some_task();
ScanlineEffect_Stop();
gMain.state++;
break;
case 2:
@@ -580,7 +576,7 @@ void sub_81BFE24()
SetBgTilemapBuffer(1, &gUnknown_0203CF1C->unkTilemap2);
SetBgTilemapBuffer(2, &gUnknown_0203CF1C->unkTilemap1);
SetBgTilemapBuffer(3, &gUnknown_0203CF1C->unkTilemap0);
sub_8121E10();
ResetAllBgsCoordinates();
schedule_bg_copy_tilemap_to_vram(1);
schedule_bg_copy_tilemap_to_vram(2);
schedule_bg_copy_tilemap_to_vram(3);
@@ -650,7 +646,7 @@ u8 sub_81BFEB0()
gUnknown_0203CF1C->unk40F0++;
break;
case 12:
LoadCompressedPalette(&gUnknown_08D97B84, 0x1D0, 0x60);
LoadCompressedPalette(&gMoveTypes_Pal, 0x1D0, 0x60);
gUnknown_0203CF1C->unk40F0 = 0;
return 1;
}
@@ -667,7 +663,7 @@ void sub_81C0098(struct Pokemon *mon)
else
{
struct BoxPokemon *boxMon = gUnknown_0203CF1C->unk0->boxMon;
sub_8069004(&boxMon[gUnknown_0203CF1C->unk40BE], mon);
BoxMonToMon(&boxMon[gUnknown_0203CF1C->unk40BE], mon);
}
}
@@ -795,7 +791,7 @@ void sub_81C0484(u8 taskId)
ResetSpriteData();
FreeAllSpritePalettes();
StopCryAndClearCrySongs();
m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100);
m4aMPlayVolumeControl(&gMPlayInfo_BGM, 0xFFFF, 0x100);
if (gMonSpritesGfxPtr == 0)
sub_806F47C(0);
sub_81C0434();
@@ -939,7 +935,7 @@ void sub_81C0704(u8 taskId)
gUnknown_0203CF1C->unk40D3 = sub_81C45F4(&gUnknown_0203CF1C->currentMon, &data[1]);
if (gUnknown_0203CF1C->unk40D3 == 0xFF)
return;
gSprites[gUnknown_0203CF1C->unk40D3].data2 = 1;
gSprites[gUnknown_0203CF1C->unk40D3].data[2] = 1;
sub_81C0E24();
data[1] = 0;
break;
@@ -954,7 +950,7 @@ void sub_81C0704(u8 taskId)
sub_81C2524();
break;
case 12:
gSprites[gUnknown_0203CF1C->unk40D3].data2 = 0;
gSprites[gUnknown_0203CF1C->unk40D3].data[2] = 0;
break;
default:
if (sub_81221EC() == 0 && FuncIsActiveTask(sub_81C20F0) == 0)
@@ -1810,7 +1806,7 @@ void sub_81C171C(u8 taskId)
void sub_81C174C(u8 taskId)
{
s16* data = gTasks[taskId].data;
if (sub_81221EC() != 1)
{
if (gPaletteFade.active != 1)
@@ -1857,7 +1853,7 @@ void sub_81C174C(u8 taskId)
gUnknown_0203CF21 = 4;
gSpecialVar_0x8005 = 4;
sub_81C044C(taskId);
}
}
}
}
}
@@ -1907,7 +1903,7 @@ void sub_81C1940(u8 taskId)
{
if (gUnknown_0203CF1C->unk40C0 != 2)
{
ClearWindowTilemap(19);
if (!gSprites[gUnknown_0203CF1C->unk40D5].invisible)
ClearWindowTilemap(13);
@@ -2224,7 +2220,7 @@ void sub_81C1E20(u8 taskId)
{
if (gUnknown_0203CF1C->unk40C0 == 2)
PutWindowTilemap(14);
}
else
{
@@ -2277,7 +2273,7 @@ void sub_81C1F80(u8 taskId)
PutWindowTilemap(15);
sub_81C240C(data[2]);
}
else
else
{
if (!gSprites[gUnknown_0203CF1C->unk40D5].invisible)
{
@@ -2345,18 +2341,18 @@ void sub_81C2194(u16 *a, u16 b, u8 c)
{
for (i = 0; i < 20; i++)
{
a[(i + var) << 1] = gUnknown_08DC3CD4[i] + b;
a[((i + var) << 1) + 0x40] = gUnknown_08DC3CD4[i] + b;
a[((i + var) << 1) + 0x80] = gUnknown_08DC3CD4[i + 20] + b;
a[(i + var) << 1] = gSummaryScreenWindow_Tilemap[i] + b;
a[((i + var) << 1) + 0x40] = gSummaryScreenWindow_Tilemap[i] + b;
a[((i + var) << 1) + 0x80] = gSummaryScreenWindow_Tilemap[i + 20] + b;
}
}
else
{
for (i = 0; i < 20; i++)
{
a[(i + var)] = gUnknown_08DC3CD4[i + 20] + b;
a[((i + var)) + 0x40] = gUnknown_08DC3CD4[i + 40] + b;
a[((i + var)) + 0x80] = gUnknown_08DC3CD4[i + 40] + b;
a[(i + var)] = gSummaryScreenWindow_Tilemap[i + 20] + b;
a[((i + var)) + 0x40] = gSummaryScreenWindow_Tilemap[i + 40] + b;
a[((i + var)) + 0x80] = gSummaryScreenWindow_Tilemap[i + 40] + b;
}
}
}
@@ -2374,7 +2370,7 @@ void sub_81C2194(u16 *a, u16 b, u8 c)
cmp r2, 0\n\
bne _081C21E4\n\
movs r3, 0\n\
ldr r5, =gUnknown_08DC3CD4\n\
ldr r5, =gSummaryScreenWindow_Tilemap\n\
_081C21A8:\n\
adds r2, r7, r3\n\
lsls r2, 1\n\
@@ -2404,7 +2400,7 @@ _081C21A8:\n\
.pool\n\
_081C21E4:\n\
movs r3, 0\n\
ldr r5, =gUnknown_08DC3CD4\n\
ldr r5, =gSummaryScreenWindow_Tilemap\n\
_081C21E8:\n\
adds r1, r7, r3\n\
lsls r1, 1\n\
@@ -2559,7 +2555,7 @@ void sub_81C2554()
void sub_81C25A4(u8 a, u8 *b, u8 c, u8 d, u8 e, u8 f)
{
AddTextPrinterParametrized2(a, 1, c, d, 0, e, &gUnknown_0861CD2C[f], 0, b);
AddTextPrinterParameterized2(a, 1, c, d, 0, e, gUnknown_0861CD2C[f], 0, b);
}
void sub_81C25E8()
@@ -2994,12 +2990,12 @@ void sub_81C307C()
{
struct PokeSummary *sum = &gUnknown_0203CF1C->summary;
u8 *text;
sub_81AFBF0();
sub_81AFC0C(0, gUnknown_0861CE74);
sub_81AFC0C(1, gUnknown_0861CE7B);
UnkTextUtil_Reset();
UnkTextUtil_SetPtrI(0, gUnknown_0861CE74);
UnkTextUtil_SetPtrI(1, gUnknown_0861CE7B);
sub_81C31C0();
if (sub_81A6BF4() == TRUE || sub_81B9E94() == TRUE || sub_81C3304() == TRUE)
sub_81AFC28(gStringVar4, gText_XNature);
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gText_XNature);
else
{
u8 *alloced1 = Alloc(32);
@@ -3008,7 +3004,7 @@ void sub_81C307C()
if (sum->metLocation <= 0xD4)
{
sub_8124610(alloced2, sum->metLocation);
sub_81AFC0C(4, alloced2);
UnkTextUtil_SetPtrI(4, alloced2);
}
if (sub_81C3220() == 1)
{
@@ -3023,7 +3019,7 @@ void sub_81C307C()
text = (sum->metLocation > 0xD4) ? gText_XNatureObtainedInTrade : gText_XNatureProbablyMetAt;
else
text = gText_XNatureObtainedInTrade;
sub_81AFC28(gStringVar4, text);
UnkTextUtil_StringExpandPlaceholders(gStringVar4, text);
Free(alloced1);
Free(alloced2);
}
@@ -3037,8 +3033,8 @@ void sub_81C3194()
void sub_81C31C0()
{
struct UnkSummaryStruct *sumStruct = gUnknown_0203CF1C;
sub_81AFC0C(2, gNatureNamePointers[sumStruct->summary.nature]);
sub_81AFC0C(5, gText_EmptyString5);
UnkTextUtil_SetPtrI(2, gNatureNamePointers[sumStruct->summary.nature]);
UnkTextUtil_SetPtrI(5, gText_EmptyString5);
}
void sub_81C31F0(u8 *a)
@@ -3047,7 +3043,7 @@ void sub_81C31F0(u8 *a)
if (level == 0)
level = 5;
ConvertIntToDecimalStringN(a, level, 0, 3);
sub_81AFC0C(3, a);
UnkTextUtil_SetPtrI(3, a);
}
u8 sub_81C3220()
@@ -3302,12 +3298,12 @@ void sub_81C3710()
ConvertIntToDecimalStringN(alloced2, gUnknown_0203CF1C->summary.maxHP, 1, 3);
ConvertIntToDecimalStringN(alloced3, gUnknown_0203CF1C->summary.atk, 1, 7);
ConvertIntToDecimalStringN(alloced4, gUnknown_0203CF1C->summary.def, 1, 7);
sub_81AFBF0();
sub_81AFC0C(0, alloced1);
sub_81AFC0C(1, alloced2);
sub_81AFC0C(2, alloced3);
sub_81AFC0C(3, alloced4);
sub_81AFC28(gStringVar4, gUnknown_0861CE82);
UnkTextUtil_Reset();
UnkTextUtil_SetPtrI(0, alloced1);
UnkTextUtil_SetPtrI(1, alloced2);
UnkTextUtil_SetPtrI(2, alloced3);
UnkTextUtil_SetPtrI(3, alloced4);
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_0861CE82);
Free(alloced1);
Free(alloced2);
Free(alloced3);
@@ -3324,11 +3320,11 @@ void sub_81C3808()
ConvertIntToDecimalStringN(gStringVar1, gUnknown_0203CF1C->summary.spatk, 1, 3);
ConvertIntToDecimalStringN(gStringVar2, gUnknown_0203CF1C->summary.spdef, 1, 3);
ConvertIntToDecimalStringN(gStringVar3, gUnknown_0203CF1C->summary.speed, 1, 3);
sub_81AFBF0();
sub_81AFC0C(0, gStringVar1);
sub_81AFC0C(1, gStringVar2);
sub_81AFC0C(2, gStringVar3);
sub_81AFC28(gStringVar4, gUnknown_0861CE8E);
UnkTextUtil_Reset();
UnkTextUtil_SetPtrI(0, gStringVar1);
UnkTextUtil_SetPtrI(1, gStringVar2);
UnkTextUtil_SetPtrI(2, gStringVar3);
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_0861CE8E);
}
void sub_81C3890()
@@ -3437,10 +3433,10 @@ void sub_81C3B08(u8 a)
sub_81C25A4(r8, gMoveNames[move], 0, (a<<4) + 1, 0, 1);
ConvertIntToDecimalStringN(gStringVar1, r10->summary.pp[a], 1, 2);
ConvertIntToDecimalStringN(gStringVar2, r6, 1, 2);
sub_81AFBF0();
sub_81AFC0C(0, gStringVar1);
sub_81AFC0C(1, gStringVar2);
sub_81AFC28(gStringVar4, gUnknown_0861CE97);
UnkTextUtil_Reset();
UnkTextUtil_SetPtrI(0, gStringVar1);
UnkTextUtil_SetPtrI(1, gStringVar2);
UnkTextUtil_StringExpandPlaceholders(gStringVar4, gUnknown_0861CE97);
text = gStringVar4;
r5 = GetCurrentPpToMaxPpState(r10->summary.pp[a], r6) + 9;
offset = GetStringRightAlignXOffset(1, text, 0x2C);
@@ -3532,17 +3528,17 @@ void sub_81C3B08(u8 a)
movs r2, 0x1\n\
movs r3, 0x2\n\
bl ConvertIntToDecimalStringN\n\
bl sub_81AFBF0\n\
bl UnkTextUtil_Reset\n\
movs r0, 0\n\
mov r1, r8\n\
bl sub_81AFC0C\n\
bl UnkTextUtil_SetPtrI\n\
movs r0, 0x1\n\
adds r1, r4, 0\n\
bl sub_81AFC0C\n\
bl UnkTextUtil_SetPtrI\n\
ldr r4, =gStringVar4\n\
ldr r1, =gUnknown_0861CE97\n\
adds r0, r4, 0\n\
bl sub_81AFC28\n\
bl UnkTextUtil_StringExpandPlaceholders\n\
adds r7, r4, 0\n\
ldrb r0, [r5]\n\
adds r1, r6, 0\n\
@@ -3645,7 +3641,7 @@ void sub_81C3D54(u8 taskId)
{
s16 *data = gTasks[taskId].data;
s16 dataa = data[0] - 1;
switch (dataa)
{
case 0:
@@ -3676,4 +3672,4 @@ void sub_81C3D54(u8 taskId)
return;
}
data[0]++;
}
}
+1 -1
View File
@@ -1,5 +1,5 @@
#include "global.h"
#include "rng.h"
#include "random.h"
// The number 1103515245 comes from the example implementation of rand and srand
// in the ISO C standard.
+2932
View File
File diff suppressed because it is too large Load Diff
+17 -17
View File
@@ -2,12 +2,12 @@
// Includes
#include "global.h"
#include "malloc.h"
#include "rng.h"
#include "items.h"
#include "random.h"
#include "constants/items.h"
#include "text.h"
#include "item.h"
#include "task.h"
#include "species.h"
#include "constants/species.h"
#include "save.h"
#include "load_save.h"
#include "pokemon.h"
@@ -15,13 +15,13 @@
#include "link.h"
#include "tv.h"
#include "battle_tower.h"
#include "new_menu_helpers.h"
#include "window.h"
#include "mystery_event_script.h"
#include "secret_base.h"
#include "mauville_old_man.h"
#include "sound.h"
#include "songs.h"
#include "constants/songs.h"
#include "menu.h"
#include "overworld.h"
#include "field_screen.h"
#include "fldeff_80F9BCC.h"
@@ -153,7 +153,7 @@ void sub_80E6CA0(struct PlayerRecords *dest)
sub_81659DC(gUnknown_0300114C, &dest->battleTowerRecord);
if (GetMultiplayerId() == 0)
{
dest->battleTowerRecord.ruby_sapphire.unk_11c8 = sub_81539D4();
dest->battleTowerRecord.ruby_sapphire.unk_11c8 = GetRecordMixingGift();
}
}
@@ -173,7 +173,7 @@ void sub_80E6D54(struct PlayerRecords *dest)
TaskDummy4(&dest->battleTowerRecord);
if (GetMultiplayerId() == 0)
{
dest->battleTowerRecord.ruby_sapphire.unk_11c8 = sub_81539D4();
dest->battleTowerRecord.ruby_sapphire.unk_11c8 = GetRecordMixingGift();
}
}
@@ -206,7 +206,7 @@ void sub_80E6E24(void)
sub_80E8AC0(&gUnknown_0203A018->battleTowerRecord);
if (GetMultiplayerId() == 0)
{
gUnknown_0203A018->unk_1210 = sub_81539D4();
gUnknown_0203A018->unk_1210 = GetRecordMixingGift();
}
sub_80E8110(gUnknown_0203A018->unk_1254, gUnknown_03001154);
sub_80E8260(gUnknown_0203A018->unk_12dc);
@@ -248,7 +248,7 @@ void sub_80E6F60(u32 which)
void sub_80E70F4(const u8 *src)
{
sub_81973C4(0, 0);
NewMenuHelpers_DrawDialogueFrame(0, 0);
PrintTextOnWindow(0, 1, src, 0, 1, 0, NULL);
CopyWindowToVram(0, 3);
}
@@ -285,7 +285,7 @@ static void sub_80E715C(u8 taskId)
if (!gTasks[data[10]].isActive)
{
data[0] = 2;
FlagSet(SYS_MIX_RECORD);
FlagSet(FLAG_SYS_MIX_RECORD);
sub_80FB074();
DestroyTask(data[15]);
}
@@ -354,8 +354,8 @@ static void sub_80E7324(u8 taskId)
}
break;
case 101:
r4 = sub_800ABAC();
if (sub_800ABBC() == TRUE)
r4 = GetLinkPlayerCount_2();
if (IsLinkMaster() == TRUE)
{
if (r4 == sub_800AA48())
{
@@ -371,14 +371,14 @@ static void sub_80E7324(u8 taskId)
}
break;
case 201:
if (sub_800AA48() == sub_800ABAC() && ++ task->data[12] > (sub_800ABAC() * 30))
if (sub_800AA48() == GetLinkPlayerCount_2() && ++ task->data[12] > (GetLinkPlayerCount_2() * 30))
{
sub_800A620();
task->data[0] = 1;
}
break;
case 301:
if (sub_800AA48() == sub_800ABAC())
if (sub_800AA48() == GetLinkPlayerCount_2())
{
task->data[0] = 1;
}
@@ -398,7 +398,7 @@ static void sub_80E7324(u8 taskId)
}
break;
case 2:
task->data[6] = sub_800ABAC();
task->data[6] = GetLinkPlayerCount_2();
task->data[0] = 0;
task->data[5] = sub_80E7810();
task->func = sub_80E756C;
@@ -1427,7 +1427,7 @@ __attribute__((naked)) static void sub_80E7B60(struct UnkStruct_80E7B60 *src, si
static void sub_80E7F68(u16 *item, u8 which)
{
if (which != 0 && *item != ITEM_NONE && GetPocketByItemId(*item) == KEYITEMS_POCKET + 1)
if (which != 0 && *item != ITEM_NONE && GetPocketByItemId(*item) == BAG_KEYITEMS)
{
if (!CheckBagHasItem(*item, 1) && !CheckPCHasItem(*item, 1) && AddBagItem(*item, 1))
{
@@ -1435,7 +1435,7 @@ static void sub_80E7F68(u16 *item, u8 which)
StringCopy(gStringVar1, gLinkPlayers[0].name);
if (*item == ITEM_EON_TICKET)
{
FlagSet(SYS_HAS_EON_TICKET);
FlagSet(FLAG_SYS_HAS_EON_TICKET);
}
}
else
File diff suppressed because it is too large Load Diff
+1948
View File
File diff suppressed because it is too large Load Diff
+639
View File
@@ -0,0 +1,639 @@
#include "global.h"
#include "reset_rtc_screen.h"
#include "event_data.h"
#include "main.h"
#include "menu.h"
#include "palette.h"
#include "rtc.h"
#include "save.h"
#include "sprite.h"
#include "constants/songs.h"
#include "sound.h"
#include "string_util.h"
#include "strings.h"
#include "task.h"
#include "text.h"
#include "scanline_effect.h"
#include "bg.h"
#include "window.h"
#include "gpu_regs.h"
struct ResetRtcStruct
{
/*0x0*/ u8 dataIndex;
/*0x2*/ u16 minVal;
/*0x4*/ u16 maxVal;
/*0x6*/ u8 left;
/*0x7*/ u8 right;
/*0x8*/ u8 unk8;
};
// this file's functions
static void CB2_ResetRtcScreen(void);
static void VBlankCB(void);
static void Task_ResetRtcScreen(u8 taskId);
static void sub_809F048(void);
// const rom data
static const struct BgTemplate sBackgroundTemplates[] =
{
{
.bg = 0,
.charBaseIndex = 0,
.mapBaseIndex = 31,
.screenSize = 0,
.paletteMode = 0,
.priority = 0,
.baseTile = 0
}
};
static const struct WindowTemplate sUnknown_08510408[] =
{
{0x00, 0x01, 0x01, 0x13, 0x09, 0x0f, 0x0155},
{0x00, 0x02, 0x0f, 0x1b, 0x04, 0x0f, 0x00e9},
DUMMY_WIN_TEMPLATE
};
static const struct WindowTemplate sUnknown_08510420 = {0x00, 0x04, 0x09, 0x15, 0x02, 0x0f, 0x00bf};
static const struct ResetRtcStruct sUnknown_08510428[5] =
{
{
.dataIndex = 3,
.minVal = 1,
.maxVal = 9999,
.left = 0,
.right = 2,
.unk8 = 0,
},
{
.dataIndex = 4,
.minVal = 0,
.maxVal = 23,
.left = 1,
.right = 3,
.unk8 = 0,
},
{
.dataIndex = 5,
.minVal = 0,
.maxVal = 59,
.left = 2,
.right = 4,
.unk8 = 0,
},
{
.dataIndex = 6,
.minVal = 0,
.maxVal = 59,
.left = 3,
.right = 5,
.unk8 = 0,
},
{
.dataIndex = 7,
.minVal = 0,
.maxVal = 0,
.left = 4,
.right = 0,
.unk8 = 6,
},
};
static const struct OamData sOamData_08510464 =
{
.y = 0,
.affineMode = 0,
.objMode = 0,
.mosaic = 0,
.bpp = 0,
.shape = 0,
.x = 0,
.matrixNum = 0,
.size = 0,
.tileNum = 0,
.priority = 0,
.paletteNum = 0,
.affineParam = 0,
};
static const u8 sResetRtcScreen_DownArrowGfx[] = INCBIN_U8("graphics/misc/reset_rtc_screen_downarrow.4bpp");
static const u8 sResetRtcScreen_RightArrowGfx[] = INCBIN_U8("graphics/misc/reset_rtc_screen_rightarrow.4bpp");
static const u16 sResetRtcScreen_ArrowPal[] = INCBIN_U16("graphics/misc/reset_rtc_screen_arrow.gbapal");
static const struct SpriteFrameImage sSpriteImageTable_85104B4[] =
{
obj_frame_tiles(sResetRtcScreen_DownArrowGfx),
obj_frame_tiles(sResetRtcScreen_RightArrowGfx)
};
static const struct SpritePalette sSpritePalette_Arrow =
{
sResetRtcScreen_ArrowPal, 0x1000
};
static const union AnimCmd sSpriteAnim_85104CC[] =
{
ANIMCMD_FRAME(0, 30),
ANIMCMD_JUMP(0),
};
static const union AnimCmd sSpriteAnim_85104D4[] =
{
ANIMCMD_FRAME(0, 158, .vFlip = TRUE),
ANIMCMD_JUMP(0),
};
static const union AnimCmd sSpriteAnim_85104DC[] =
{
ANIMCMD_FRAME(1, 30),
ANIMCMD_JUMP(0),
};
static const union AnimCmd *const sSpriteAnimTable_85104E4[] =
{
sSpriteAnim_85104CC,
sSpriteAnim_85104D4,
sSpriteAnim_85104DC,
};
static const struct SpriteTemplate sSpriteTemplate_85104F0 =
{
.tileTag = 0xFFFF,
.paletteTag = 0x1000,
.oam = &sOamData_08510464,
.anims = sSpriteAnimTable_85104E4,
.images = sSpriteImageTable_85104B4,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy,
};
// code
static void SpriteCB_ResetRtcCursor0(struct Sprite *sprite)
{
int state = gTasks[sprite->data[0]].data[2];
if (state != sprite->data[1])
{
sprite->data[1] = state;
switch (state)
{
case 1:
sprite->invisible = FALSE;
sprite->animNum = 1;
sprite->animDelayCounter = 0;
sprite->pos1.x = 53;
sprite->pos1.y = 68;
break;
case 2:
sprite->invisible = FALSE;
sprite->animNum = 1;
sprite->animDelayCounter = 0;
sprite->pos1.x = 86;
sprite->pos1.y = 68;
break;
case 3:
sprite->invisible = FALSE;
sprite->animNum = 1;
sprite->animDelayCounter = 0;
sprite->pos1.x = 101;
sprite->pos1.y = 68;
break;
case 4:
sprite->invisible = FALSE;
sprite->animNum = 1;
sprite->animDelayCounter = 0;
sprite->pos1.x = 116;
sprite->pos1.y = 68;
break;
case 5:
sprite->invisible = FALSE;
sprite->animNum = 2;
sprite->animDelayCounter = 0;
sprite->pos1.x = 153;
sprite->pos1.y = 80;
break;
case 6:
DestroySprite(sprite);
break;
}
}
}
static void SpriteCB_ResetRtcCursor1(struct Sprite *sprite)
{
int state = gTasks[sprite->data[0]].data[2];
if (state != sprite->data[1])
{
sprite->data[1] = state;
switch (state)
{
case 1:
sprite->invisible = FALSE;
sprite->animNum = 0;
sprite->animDelayCounter = 0;
sprite->pos1.x = 53;
sprite->pos1.y = 92;
break;
case 2:
sprite->invisible = FALSE;
sprite->animNum = 0;
sprite->animDelayCounter = 0;
sprite->pos1.x = 86;
sprite->pos1.y = 92;
break;
case 3:
sprite->invisible = FALSE;
sprite->animNum = 0;
sprite->animDelayCounter = 0;
sprite->pos1.x = 101;
sprite->pos1.y = 92;
break;
case 4:
sprite->invisible = FALSE;
sprite->animNum = 0;
sprite->animDelayCounter = 0;
sprite->pos1.x = 116;
sprite->pos1.y = 92;
break;
case 5:
sprite->invisible = TRUE;
break;
case 6:
DestroySprite(sprite);
break;
}
}
}
static void CreateCursor(u8 taskId)
{
u32 spriteId;
LoadSpritePalette(&sSpritePalette_Arrow);
spriteId = CreateSpriteAtEnd(&sSpriteTemplate_85104F0, 53, 68, 0);
gSprites[spriteId].callback = SpriteCB_ResetRtcCursor0;
gSprites[spriteId].data[0] = taskId;
gSprites[spriteId].data[1] = -1;
spriteId = CreateSpriteAtEnd(&sSpriteTemplate_85104F0, 53, 68, 0);
gSprites[spriteId].callback = SpriteCB_ResetRtcCursor1;
gSprites[spriteId].data[0] = taskId;
gSprites[spriteId].data[1] = -1;
}
static void FreeCursorPalette(void)
{
FreeSpritePaletteByTag(sSpritePalette_Arrow.tag);
}
static void HideChooseTimeWindow(u8 windowId)
{
sub_8198070(windowId, FALSE);
RemoveWindow(windowId);
schedule_bg_copy_tilemap_to_vram(0);
}
static void PrintTime(u8 windowId, u8 x, u8 y, u16 days, u8 hours, u8 minutes, u8 seconds)
{
u8 *dest = gStringVar4;
ConvertIntToDecimalStringN(gStringVar1, days, 1, 4);
dest = StringCopy(dest, gStringVar1);
dest = StringCopy(dest, gText_Day);
ConvertIntToDecimalStringN(gStringVar1, hours, 1, 3);
dest = StringCopy(dest, gStringVar1);
dest = StringCopy(dest, gText_Colon3);
ConvertIntToDecimalStringN(gStringVar1, minutes, 2, 2);
dest = StringCopy(dest, gStringVar1);
dest = StringCopy(dest, gText_Colon3);
ConvertIntToDecimalStringN(gStringVar1, seconds, 2, 2);
dest = StringCopy(dest, gStringVar1);
PrintTextOnWindow(windowId, 1, gStringVar4, x, y, TEXT_SPEED_FF, NULL);
}
static void ShowChooseTimeWindow(u8 windowId, u16 days, u8 hours, u8 minutes, u8 seconds)
{
SetWindowBorderStyle(windowId, FALSE, 0x214, 0xE);
PrintTime(windowId, 0, 1, days, hours, minutes, seconds);
PrintTextOnWindow(windowId, 1, gText_Confirm2, 126, 1, 0, NULL);
schedule_bg_copy_tilemap_to_vram(0);
}
static bool32 MoveTimeUpDown(s16 *val, int minVal, int maxVal, u16 keys)
{
if (keys & DPAD_DOWN)
{
*val -= 1;
if (*val < minVal)
*val = maxVal;
}
else if (keys & DPAD_UP)
{
*val += 1;
if (*val > maxVal)
*val = minVal;
}
else if (keys & DPAD_LEFT)
{
*val -= 10;
if (*val < minVal)
*val = maxVal;
}
else if (keys & DPAD_RIGHT)
{
*val += 10;
if (*val > maxVal)
*val = minVal;
}
else
{
return FALSE;
}
return TRUE;
}
static void Task_ResetRtc_3(u8 taskId)
{
gTasks[taskId].data[0] = 1;
}
static void Task_ResetRtc_2(u8 taskId)
{
s16 *data = gTasks[taskId].data;
HideChooseTimeWindow(data[8]);
FreeCursorPalette();
gTasks[taskId].func = Task_ResetRtc_3;
}
static void Task_ResetRtc_1(u8 taskId)
{
s16 *data = gTasks[taskId].data;
u8 selection = data[2];
const struct ResetRtcStruct *selectionInfo = &sUnknown_08510428[selection - 1];
if (gMain.newKeys & B_BUTTON)
{
gTasks[taskId].func = Task_ResetRtc_2;
data[1] = 0;
data[2] = 6;
PlaySE(SE_SELECT);
return;
}
if (gMain.newKeys & DPAD_RIGHT)
{
if (selectionInfo->right)
{
data[2] = selectionInfo->right;
PlaySE(SE_SELECT);
return;
}
}
if (gMain.newKeys & DPAD_LEFT)
{
if (selectionInfo->left)
{
data[2] = selectionInfo->left;
PlaySE(SE_SELECT);
return;
}
}
if (selection == 5)
{
if (gMain.newKeys & A_BUTTON)
{
gLocalTime.days = data[3];
gLocalTime.hours = data[4];
gLocalTime.minutes = data[5];
gLocalTime.seconds = data[6];
PlaySE(SE_SELECT);
gTasks[taskId].func = Task_ResetRtc_2;
data[1] = 1;
data[2] = 6;
}
}
else if (MoveTimeUpDown(&data[selectionInfo->dataIndex], selectionInfo->minVal, selectionInfo->maxVal, gMain.newAndRepeatedKeys & (DPAD_UP | DPAD_DOWN)))
{
PlaySE(SE_SELECT);
PrintTime(data[8], 0, 1, data[3], data[4], data[5], data[6]);
CopyWindowToVram(data[8], 2);
}
}
static void Task_ResetRtc_0(u8 taskId)
{
s16 *data = gTasks[taskId].data;
data[0] = 0;
data[3] = gLocalTime.days;
data[4] = gLocalTime.hours;
data[5] = gLocalTime.minutes;
data[6] = gLocalTime.seconds;
data[8] = AddWindow(&sUnknown_08510420);
ShowChooseTimeWindow(data[8], data[3], data[4], data[5], data[6]);
CreateCursor(taskId);
data[2] = 2;
gTasks[taskId].func = Task_ResetRtc_1;
}
void CB2_InitResetRtcScreen(void)
{
SetGpuReg(REG_OFFSET_DISPCNT, 0);
SetVBlankCallback(NULL);
DmaClear16(3, PLTT, PLTT_SIZE);
DmaFillLarge16(3, 0, (u8 *)VRAM, 0x18000, 0x1000);
ResetOamRange(0, 128);
LoadOam();
ScanlineEffect_Stop();
ScanlineEffect_Clear();
ResetSpriteData();
ResetTasks();
ResetPaletteFade();
sub_809F048();
SetVBlankCallback(VBlankCB);
SetMainCallback2(CB2_ResetRtcScreen);
CreateTask(Task_ResetRtcScreen, 80);
}
static void sub_809F048(void)
{
clear_scheduled_bg_copies_to_vram();
ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(0, sBackgroundTemplates, ARRAY_COUNT(sBackgroundTemplates));
schedule_bg_copy_tilemap_to_vram(0);
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
ShowBg(0);
InitWindows(sUnknown_08510408);
DeactivateAllTextPrinters();
sub_81973A4();
}
static void CB2_ResetRtcScreen(void)
{
RunTasks();
AnimateSprites();
BuildOamBuffer();
do_scheduled_bg_tilemap_copies_to_vram();
UpdatePaletteFade();
}
static void VBlankCB(void)
{
ProcessSpriteCopyRequests();
LoadOam();
TransferPlttBuffer();
}
static void ShowMessage(const u8 *str)
{
sub_8197B1C(1, FALSE, 0x200, 0xF);
PrintTextOnWindow(1, 1, str, 0, 1, 0, NULL);
schedule_bg_copy_tilemap_to_vram(0);
}
static void Task_ShowResetRtcPrompt(u8 taskId)
{
s16 *data = gTasks[taskId].data;
switch (data[0])
{
case 0:
SetWindowBorderStyle(0, FALSE, 0x214, 0xE);
PrintTextOnWindow(0, 1, gText_PresentTime, 0, 1, TEXT_SPEED_FF, 0);
PrintTime(
0,
0,
17,
gLocalTime.days,
gLocalTime.hours,
gLocalTime.minutes,
gLocalTime.seconds);
PrintTextOnWindow(0, 1, gText_PreviousTime, 0, 33, TEXT_SPEED_FF, 0);
PrintTime(
0,
0,
49,
gSaveBlock2Ptr->lastBerryTreeUpdate.days,
gSaveBlock2Ptr->lastBerryTreeUpdate.hours,
gSaveBlock2Ptr->lastBerryTreeUpdate.minutes,
gSaveBlock2Ptr->lastBerryTreeUpdate.seconds);
ShowMessage(gText_ResetRTCConfirmCancel);
CopyWindowToVram(0, 2);
schedule_bg_copy_tilemap_to_vram(0);
data[0]++;
case 1:
if (gMain.newKeys & B_BUTTON)
{
DestroyTask(taskId);
DoSoftReset();
}
else if (gMain.newKeys & A_BUTTON)
{
PlaySE(SE_SELECT);
DestroyTask(taskId);
}
break;
}
}
static void Task_ResetRtcScreen(u8 taskId)
{
s16 *data = gTasks[taskId].data;
switch (data[0])
{
case 0:
BeginNormalPaletteFade(-1, 1, 0x10, 0, 0xFFFF);
data[0] = 1;
break;
case 1:
if (!gPaletteFade.active)
{
if (gSaveFileStatus == 0 || gSaveFileStatus == 2)
{
ShowMessage(gText_NoSaveFileCantSetTime);
data[0] = 5;
}
else
{
RtcCalcLocalTime();
data[1] = CreateTask(Task_ShowResetRtcPrompt, 80);
data[0] = 2;
}
}
break;
case 2:
if (gTasks[data[1]].isActive != TRUE)
{
sub_8198070(0, FALSE);
ShowMessage(gText_PleaseResetTime);
gLocalTime = gSaveBlock2Ptr->lastBerryTreeUpdate;
data[1] = CreateTask(Task_ResetRtc_0, 80);
data[0] = 3;
}
break;
case 3:
if (gTasks[data[1]].data[0])
{
if (!gTasks[data[1]].data[1])
{
DestroyTask(data[1]);
data[0] = 2;
}
else
{
DestroyTask(data[1]);
RtcReset();
RtcCalcLocalTimeOffset(
gLocalTime.days,
gLocalTime.hours,
gLocalTime.minutes,
gLocalTime.seconds);
gSaveBlock2Ptr->lastBerryTreeUpdate = gLocalTime;
VarSet(VAR_DAYS, gLocalTime.days);
DisableResetRTC();
ShowMessage(gText_ClockHasBeenReset);
data[0] = 4;
}
}
break;
case 4:
if (TrySavingData(0) == 1)
{
ShowMessage(gText_SaveCompleted);
PlaySE(SE_PINPON);
}
else
{
ShowMessage(gText_SaveFailed);
PlaySE(SE_BOO);
}
data[0] = 5;
case 5:
if (gMain.newKeys & A_BUTTON)
{
BeginNormalPaletteFade(-1, 1, 0, 0x10, 0xFFFF);
data[0] = 6;
}
else
{
break;
}
case 6:
if (!gPaletteFade.active)
{
DestroyTask(taskId);
FreeAllWindowBuffers();
DoSoftReset();
}
}
}
+2 -4
View File
@@ -15,7 +15,7 @@ void sub_81700F8(void)
imeBackup = REG_IME;
REG_IME = 0;
RegisterRamReset(0x00000001);
ClearGpuRegBits(REG_OFFSET_DISPCNT, 0x80);
ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_FORCED_BLANK);
REG_IME = imeBackup;
gMain.inBattle = FALSE;
SetSaveBlocksPointers(sub_815355C());
@@ -23,10 +23,8 @@ void sub_81700F8(void)
ResetSaveCounters();
sub_81534D0(0);
if (gSaveFileStatus == 0 || gSaveFileStatus == 2)
{
Sav2_ClearSetDefault();
}
SetPokemonCryStereo(gSaveBlock2Ptr->optionsSound);
InitHeap(gHeap, 0x1c000);
InitHeap(gHeap, HEAP_SIZE);
SetMainCallback2(sub_8086230);
}

Some files were not shown because too many files have changed in this diff Show More