From e0d828bb48c30033208bf27153e06b23ea52d0fd Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Fri, 21 Mar 2025 20:05:55 +0100 Subject: [PATCH] add FREE_BATTLE_TOWER_E_READER functionality --- include/global.h | 2 ++ src/battle_tower.c | 47 ++++++++++++++++++++++++++++++++++++++ src/mystery_event_script.c | 2 ++ src/mystery_gift.c | 2 ++ src/mystery_gift_client.c | 2 ++ src/pokemon_jump.c | 4 ++++ src/quest_log.c | 4 ++-- src/trainer_card.c | 4 ++++ 8 files changed, 65 insertions(+), 2 deletions(-) diff --git a/include/global.h b/include/global.h index 9957b9d15..a3f540b40 100644 --- a/include/global.h +++ b/include/global.h @@ -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; diff --git a/src/battle_tower.c b/src/battle_tower.c index 37b461e4b..48521f5bd 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -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) diff --git a/src/mystery_event_script.c b/src/mystery_event_script.c index f3520346e..813aacbf0 100644 --- a/src/mystery_event_script.c +++ b/src/mystery_event_script.c @@ -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; } diff --git a/src/mystery_gift.c b/src/mystery_gift.c index d4a0f29ff..7b4be4547 100644 --- a/src/mystery_gift.c +++ b/src/mystery_gift.c @@ -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) diff --git a/src/mystery_gift_client.c b/src/mystery_gift_client.c index ab25ceb43..a3746a23c 100644 --- a/src/mystery_gift_client.c +++ b/src/mystery_gift_client.c @@ -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); diff --git a/src/pokemon_jump.c b/src/pokemon_jump.c index d0863ad12..7a8bdfee6 100644 --- a/src/pokemon_jump.c +++ b/src/pokemon_jump.c @@ -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 diff --git a/src/quest_log.c b/src/quest_log.c index 5e344b166..726cd3de5 100644 --- a/src/quest_log.c +++ b/src/quest_log.c @@ -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]); } } diff --git a/src/trainer_card.c b/src/trainer_card.c index c4e9eaa7d..133713aa0 100644 --- a/src/trainer_card.c +++ b/src/trainer_card.c @@ -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);