add FREE_BATTLE_TOWER_E_READER functionality

This commit is contained in:
cawtds
2025-03-21 20:05:55 +01:00
parent 69ce201014
commit e0d828bb48
8 changed files with 65 additions and 2 deletions

View File

@@ -346,7 +346,9 @@ struct BattleTowerData // Leftover from R/S
/*0x03DA, 0x048A*/ u16 defeatedBySpecies; // species of the pokemon that defated the player
/*0x03DC, 0x048C*/ u8 defeatedByTrainerName[8];
/*0x03E4, 0x0494*/ u8 firstMonNickname[VANILLA_POKEMON_NAME_LENGTH]; // nickname of the first pokemon in the player's battle tower party
#if FREE_BATTLE_TOWER_E_READER == FALSE
/*0x03F0, 0x04A0*/ struct BattleTowerEReaderTrainer ereaderTrainer;
#endif //FREE_BATTLE_TOWER_E_READER
/*0x04AC, 0x055C*/ u8 battleTowerLevelType:1; // 0 = level 50; 1 = level 100
/*0x04AC, 0x055C*/ u8 unk_554:1;
/*0x04AD, 0x055D*/ u8 battleOutcome;

View File

@@ -235,6 +235,7 @@ static void ResetBattleTowerStreak(u8 levelType)
gSaveBlock2Ptr->battleTower.curStreakChallengesNum[levelType] = 1;
}
#if FREE_BATTLE_TOWER_E_READER == FALSE
static bool8 ShouldBattleEReaderTrainer(u8 levelType, u16 winStreak)
{
u8 trainerTeamLevel;
@@ -275,6 +276,7 @@ static bool8 ShouldBattleEReaderTrainer(u8 levelType, u16 winStreak)
return (numValid == 3);
}
#endif //FREE_BATTLE_TOWER_E_READER
static bool8 ChooseSpecialBattleTowerTrainer(void)
{
@@ -289,12 +291,15 @@ static bool8 ChooseSpecialBattleTowerTrainer(void)
battleTowerLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType;
winStreak = GetCurrentBattleTowerWinStreak(battleTowerLevelType);
#if FREE_BATTLE_TOWER_E_READER == FALSE
if (ShouldBattleEReaderTrainer(battleTowerLevelType, winStreak))
{
gSaveBlock2Ptr->battleTower.battleTowerTrainerId = BATTLE_TOWER_EREADER_TRAINER_ID;
retVal = TRUE;
}
else
#endif //FREE_BATTLE_TOWER_E_READER
{
// Check if one of the battle tower trainers from record mixing should be the next trainer.
for (recordIndex = 0; recordIndex < 5; recordIndex++)
@@ -407,11 +412,15 @@ void SetEReaderTrainerGfxId(void)
u8 GetBattleTowerTrainerFrontSpriteId(u16 trainerId)
{
#if FREE_BATTLE_TOWER_E_READER == FALSE
if (trainerId == BATTLE_TOWER_EREADER_TRAINER_ID)
{
return gFacilityClassToPicIndex[gSaveBlock2Ptr->battleTower.ereaderTrainer.trainerClass];
}
else if (trainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)
#else
if (trainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)
#endif //FREE_BATTLE_TOWER_E_READER
{
return gFacilityClassToPicIndex[sBattleTowerTrainers[trainerId].trainerClass];
}
@@ -423,11 +432,15 @@ u8 GetBattleTowerTrainerFrontSpriteId(u16 trainerId)
u8 GetBattleTowerTrainerClassNameId(void)
{
#if FREE_BATTLE_TOWER_E_READER == FALSE
if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID)
{
return gFacilityClassToTrainerClass[gSaveBlock2Ptr->battleTower.ereaderTrainer.trainerClass];
}
else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId >= BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)
#else
if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId >= BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)
#endif //FREE_BATTLE_TOWER_E_READER
{
return gFacilityClassToTrainerClass[gSaveBlock2Ptr->battleTower.records[gSaveBlock2Ptr->battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].trainerClass];
}
@@ -440,12 +453,16 @@ u8 GetBattleTowerTrainerClassNameId(void)
void GetBattleTowerTrainerName(u8 *dest)
{
s32 i;
#if FREE_BATTLE_TOWER_E_READER == FALSE
if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID)
{
for (i = 0; i < PLAYER_NAME_LENGTH; i++)
dest[i] = gSaveBlock2Ptr->battleTower.ereaderTrainer.name[i];
}
else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)
#else
if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)
#endif //FREE_BATTLE_TOWER_E_READER
{
for (i = 0; i < 3; i++)
dest[i] = sBattleTowerTrainers[gSaveBlock2Ptr->battleTower.battleTowerTrainerId].name[i];
@@ -520,6 +537,7 @@ static void FillBattleTowerTrainerParty(void)
battleMonsOffset = 200;
monPoolSize = 100;
}
#if FREE_BATTLE_TOWER_E_READER == FALSE
else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID)
{
// Load E-Reader trainer's party.
@@ -530,6 +548,7 @@ static void FillBattleTowerTrainerParty(void)
return;
} while (0);
}
#endif //FREE_BATTLE_TOWER_E_READER
else
{
// Load a battle tower record's party. (From record mixing)
@@ -768,9 +787,13 @@ static void BufferBattleTowerTrainerMessage(const u16 *greeting)
void PrintBattleTowerTrainerGreeting(void)
{
#if FREE_BATTLE_TOWER_E_READER == FALSE
if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID)
BufferBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.ereaderTrainer.greeting);
else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)
#else
if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID)
#endif //FREE_BATTLE_TOWER_E_READER
BufferBattleTowerTrainerMessage(sBattleTowerTrainers[gSaveBlock2Ptr->battleTower.battleTowerTrainerId].greeting);
else
BufferBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.records[gSaveBlock2Ptr->battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].greeting);
@@ -845,6 +868,7 @@ void StartSpecialBattle(void)
BattleTransition_StartOnField(transition);
break;
case 2: // e-reader trainer battle
#if FREE_BATTLE_TOWER_E_READER == FALSE
ZeroEnemyPartyMons();
for (i = 0; i < 3; i++)
@@ -857,6 +881,7 @@ void StartSpecialBattle(void)
PlayMapChosenOrBattleBGM(0);
transition = BattleSetup_GetBattleTowerBattleTransition();
BattleTransition_StartOnField(transition);
#endif //FREE_BATTLE_TOWER_E_READER
break;
}
}
@@ -889,8 +914,10 @@ void SetBattleTowerProperty(void)
gSaveBlock2Ptr->battleTower.selectedPartyMons[i] = gSelectedOrderFromParty[i];
break;
case 6:
#if FREE_BATTLE_TOWER_E_READER == FALSE
if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID)
ClearEReaderTrainer(&gSaveBlock2Ptr->battleTower.ereaderTrainer);
#endif //FREE_BATTLE_TOWER_E_READER
if (gSaveBlock2Ptr->battleTower.totalBattleTowerWins < 9999)
gSaveBlock2Ptr->battleTower.totalBattleTowerWins++;
gSaveBlock2Ptr->battleTower.curChallengeBattleNum[battleTowerLevelType]++;
@@ -1211,27 +1238,40 @@ void AwardBattleTowerRibbons(void)
u8 GetEreaderTrainerFrontSpriteId(void)
{
#if FREE_BATTLE_TOWER_E_READER == FALSE
return gFacilityClassToPicIndex[gSaveBlock2Ptr->battleTower.ereaderTrainer.trainerClass];
#else
return 0;
#endif //FREE_BATTLE_TOWER_E_READER
}
u8 GetEreaderTrainerClassId(void)
{
#if FREE_BATTLE_TOWER_E_READER == FALSE
return gFacilityClassToTrainerClass[gSaveBlock2Ptr->battleTower.ereaderTrainer.trainerClass];
#else
return 0;
#endif //FREE_BATTLE_TOWER_E_READER
}
void CopyEReaderTrainerName5(u8 *trainerName)
{
#if FREE_BATTLE_TOWER_E_READER == FALSE
s32 i;
for (i = 0; i < 5; i++)
trainerName[i] = gSaveBlock2Ptr->battleTower.ereaderTrainer.name[i];
trainerName[i] = EOS;
#else
trainerName[0] = EOS;
#endif //FREE_BATTLE_TOWER_E_READER
}
// Checks if the saved E-Reader trainer is valid.
void ValidateEReaderTrainer(void)
{
#if FREE_BATTLE_TOWER_E_READER == FALSE
u32 i;
u32 checksum;
struct BattleTowerEReaderTrainer *ereaderTrainer;
@@ -1258,6 +1298,9 @@ void ValidateEReaderTrainer(void)
ClearEReaderTrainer(&gSaveBlock2Ptr->battleTower.ereaderTrainer);
gSpecialVar_Result = 1;
}
#else
gSpecialVar_Result = FALSE;
#endif //FREE_BATTLE_TOWER_E_READER
}
void ClearEReaderTrainer(struct BattleTowerEReaderTrainer *ereaderTrainer)
@@ -1270,17 +1313,21 @@ void ClearEReaderTrainer(struct BattleTowerEReaderTrainer *ereaderTrainer)
void BufferEReaderTrainerGreeting(void)
{
#if FREE_BATTLE_TOWER_E_READER == FALSE
BufferBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.ereaderTrainer.greeting);
#endif //FREE_BATTLE_TOWER_E_READER
}
static void PrintEReaderTrainerFarewellMessage(void)
{
#if FREE_BATTLE_TOWER_E_READER == FALSE
if (gBattleOutcome == B_OUTCOME_DREW)
gStringVar4[0] = EOS;
else if (gBattleOutcome == B_OUTCOME_WON)
BufferBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.ereaderTrainer.farewellPlayerWon);
else
BufferBattleTowerTrainerMessage(gSaveBlock2Ptr->battleTower.ereaderTrainer.farewellPlayerLost);
#endif //FREE_BATTLE_TOWER_E_READER
}
void Dummy_TryEnableBravoTrainerBattleTower(void)

View File

@@ -282,11 +282,13 @@ bool8 MEScrCmd_givepokemon(struct ScriptContext *ctx)
bool8 MEScrCmd_addtrainer(struct ScriptContext *ctx)
{
#if FREE_BATTLE_TOWER_E_READER == FALSE
u32 data = ScriptReadWord(ctx) - ctx->data[1] + ctx->data[0];
memcpy(&gSaveBlock2Ptr->battleTower.ereaderTrainer, (void *)data, sizeof(struct BattleTowerEReaderTrainer));
ValidateEReaderTrainer();
StringExpandPlaceholders(gStringVar4, gText_MysteryGiftNewTrainer);
ctx->data[2] = 2;
#endif //FREE_BATTLE_TOWER_E_READER
return FALSE;
}

View File

@@ -210,7 +210,9 @@ void ClearSavedWonderCardAndRelated(void)
ClearMysteryGiftFlags();
ClearMysteryGiftVars();
#endif //FREE_MYSTERY_GIFT
#if FREE_BATTLE_TOWER_E_READER == FALSE
ClearEReaderTrainer(&gSaveBlock2Ptr->battleTower.ereaderTrainer);
#endif //FREE_BATTLE_TOWER_E_READER
}
bool32 SaveWonderCard(const struct WonderCard * card)

View File

@@ -231,8 +231,10 @@ static u32 Client_Run(struct MysteryGiftClient * client)
InitRamScript_NoObjectEvent(client->recvBuffer, sizeof(struct RamScriptData));
break;
case CLI_RECV_EREADER_TRAINER:
#if FREE_BATTLE_TOWER_E_READER == FALSE
memcpy(&gSaveBlock2Ptr->battleTower.ereaderTrainer, client->recvBuffer, sizeof(gSaveBlock2Ptr->battleTower.ereaderTrainer));
ValidateEReaderTrainer();
#endif //FREE_BATTLE_TOWER_E_READER
break;
case CLI_RUN_BUFFER_SCRIPT:
memcpy(gDecompressionBuffer, client->recvBuffer, MG_LINK_BUFFER_SIZE);

View File

@@ -368,7 +368,9 @@ static void SpriteCB_MonHitShake(struct Sprite *sprite);
static void SpriteCB_MonHitFlash(struct Sprite *sprite);
static void SpriteCB_MonIntroBounce(struct Sprite *sprite);
static void Task_ShowPokemonJumpRecords(u8 taskId);
#if FREE_POKEMON_JUMP == FALSE
static void TruncateToFirstWordOnly(u8 *str);
#endif //FREE_POKEMON_JUMP
static void PrintRecordsText(u16 windowId);
static void UpdateVineSwing(int id);
static void StartPokeJumpGfx(struct PokemonJumpGfx *);
@@ -4396,6 +4398,7 @@ static void PrintRecordsText(u16 windowId)
#endif //FREE_POKEMON_JUMP
}
#if FREE_POKEMON_JUMP == FALSE
static void TruncateToFirstWordOnly(u8 *str)
{
for (;*str != EOS; str++)
@@ -4407,3 +4410,4 @@ static void TruncateToFirstWordOnly(u8 *str)
}
}
}
#endif //FREE_POKEMON_JUMP

View File

@@ -386,14 +386,14 @@ static void BackUpTrainerRematches(void)
{
vars[i] = 0;
#if FREE_MATCH_CALL == FALSE
// 16 bits per var
for (j = 0; j < 16; j++)
{
#if FREE_MATCH_CALL == FALSE
if (gSaveBlock1Ptr->trainerRematches[16 * i + j])
vars[i] += (1 << j);
}
#endif //FREE_MATCH_CALL
}
VarSet(VAR_QLBAK_TRAINER_REMATCHES + i, vars[i]);
}
}

View File

@@ -870,7 +870,11 @@ void TrainerCard_GenerateCardForLinkPlayer(struct TrainerCard *trainerCard)
trainerCard->rse.caughtAllHoenn = HasAllKantoMons();
trainerCard->hasAllMons = HasAllMons();
trainerCard->berriesPicked = gSaveBlock2Ptr->berryPick.berriesPicked;
#if FREE_POKEMON_JUMP == FALSE
trainerCard->jumpsInRow = gSaveBlock2Ptr->pokeJump.jumpsInRow;
#else
trainerCard->jumpsInRow = 0;
#endif //FREE_POKEMON_JUMP
trainerCard->berryCrushPoints = GetCappedGameStat(GAME_STAT_BERRY_CRUSH_POINTS, 0xFFFF);
trainerCard->unionRoomNum = GetCappedGameStat(GAME_STAT_NUM_UNION_ROOM_BATTLES, 0xFFFF);