pokeemerald/src/new_game.c

216 lines
5.5 KiB
C
Raw Normal View History

2017-09-03 22:50:17 +02:00
#include "global.h"
#include "new_game.h"
#include "random.h"
2017-09-07 19:45:32 +02:00
#include "pokemon.h"
#include "roamer.h"
#include "pokemon_size_record.h"
#include "script.h"
#include "lottery_corner.h"
#include "play_time.h"
#include "mauville_old_man.h"
2019-02-08 18:48:51 +01:00
#include "match_call.h"
2017-09-07 19:45:32 +02:00
#include "lilycove_lady.h"
#include "load_save.h"
#include "pokeblock.h"
#include "dewford_trend.h"
#include "berry.h"
#include "rtc.h"
#include "easy_chat.h"
#include "event_data.h"
#include "money.h"
2019-01-13 20:50:08 +01:00
#include "trainer_hill.h"
Decompile TV (#80) * ClearTVShowData * special_0x44 * DoTVShow (nonmatching because align) * DoTVShowBravoTrainerPokemonProfile * Update field names * DoTVShowBravoTrainerBattleTower * Renaming of struct fields * sub_80EBFF4 and UpdateTVScreensOnMap * SetTVMetatilesOnMap * Power buttons for the TV screens on the map * special_0x45 * sub_80EC18C * special_0x4a * ResetGabbyAndTy * GabbyAndTyBeforeInterview * GabbyAndTyAfterInterview * Through IsTVShowInSearchOfTrainersAiring * GabbyAndTyGetLastQuote * GabbyAndTyGetLastBattleTrivia * GabbyAndTySetScriptVarsToFieldObjectLocalIds * InterviewAfter; use TVShow as a precursor for making the individual show structs anonymous * Make TV structs anonymous within the union * Move the TV union to its own subheader * Move TV show enums to the global.tv.h subheader * Funcion renaming * Apply static attributes where able * PutPokemonTodayCaughtOnAir * sub_80EC8A4 * PutPokemonTodayFailedOnTheAir * sub_80EC9E8, sub_80ECA10 * sub_80ECA38 * sub_80ECB00 * Put3CheersForPokeblocksOnTheAir * PutFanClubSpecialOnTheAir * ContestLiveUpdates_BeforeInterview * Other before-interview Contest Live Updates functions * ContestLiveUpdates_BeforeInterview_5 * InterviewAfter_BravoTrainerPokemonProfile * BravoTrainerPokemonProfile_BeforeInterview1 * BravoTrainerPokemonProfile_BeforeInterview2 * Disassemble TV data * Decompile TV data * InterviewAfter_BravoTrainerBattleTowerProfile * SaveRecordedItemPurchasesForTVShow * PutNameRaterShowOnTheAir * StartMassOutbreak * PutLilycoveContestLadyShowOnTheAir * InterviewAfter_FanClubLetter * Rip TV strings * InterviewAfter_RecentHappenings * InterviewAfter_PkmnFanClubOpinions * sub_80ED718 * EndMassOutbreak * sub_80ED888 * sub_80ED8B4 * UpdateMassOutbreakTimeLeft * sub_80ED950 * PutFishingAdviceShowOnTheAir * through sub_80EDA80 * ewram and common syms are now fetched from the object files * BSS symbols are taken from the tv.o file * through sub_80EDC60 * sub_80EDCE8 * sub_80EDD78 * through sub_80EDE84 * nomatching sub_80EDE98 * sub_80EDFB4 * sub_80EE104 * sub_80EE104 * sub_80EE184 * sub_80EE2CC * sub_80EE35C * sub_80EE44C * sub_80EE4DC * sub_80EE5A4 * sub_80EE69C * sub_80EE72C * sub_80EE7C0 * sub_80EE818 * sub_80EE8C8 * sub_80EEA70 * sub_80EEB98 * sub_80EEBF4 * through sub_80EED60 * Functions relating to Pokemon News * sub_80EEF6C * GetPriceReduction * IsPriceDiscounted * sub_80EF120 * through sub_80EF370 * sub_80EF40C * HasMixableShowAlreadyBeenSpawnedWithPlayerID * TV_SortPurchasesByQuantity * FindActiveBroadcastByShowType_SetScriptResult * InterviewBefore * through sub_80EF88C * through sub_80EF93C * through sub_80EFA24 * through TV_BernoulliTrial * sub_80EFB58 * sub_80EFBA4 * sub_80EFBDC * through sub_80EFD98 * ChangePokemonNickname * ChangeBoxPokemonNickname * sub_80EFF9C * through player_id_to_dword * CheckForBigMovieOrEmergencyNewsOnTV * GetMomOrDadStringForTVMessage * sub_80F01E8 * sub_80F0358 * sub_80F049C * TV record mixing functions * sub_80F06D0 * sub_80F0708 nonmatching * through sub_80F0B24 * sub_80F0B64 * through sub_80F0C04 * sub_80F0C7C * sub_80F0D60 * sub_80F0E58 * sub_80F0E84 * through sub_80F0F24 * sub_80F0F64 * sub_80F1208 * sub_80F1254 * sub_80F1290 * sub_80F12A4 * sub_80F14F8 * DoTVShowTodaysSmartShopper * DoTVShowTheNameRaterShow * DoTVShowPokemonTodaySuccessfulCapture * DoTVShowPokemonTodayFailedCapture * DoTVShowPokemonFanClubLetter * DoTVShowRecentHappenings * DoTVShowPokemonFanClubOpinions * DoTVShowPokemonNewsMassOutbreak * DoTVShowPokemonContestLiveUpdates * DoTVShowPokemonBattleUpdate * DoTVShow3CheersForPokeblocks * DoTVShowInSearchOfTrainers * Label GabbyAndTyData fields; remove ddump comments from data/text/tv.inc * DoTVShowPokemonAngler * DoTVShowTheWorldOfMasters; update RAM symbols and field names * Decorate static functions * DoTVShowTodaysRivalTrainer; region map enums * TVDewfordTrendWatcherNetworkTextGroup * DoTVShowHoennTreasureInvestigators * DoTVShowFindThatGamer * DoTVShowBreakingNewsTV * DoTVShowSecretBaseVisit * DoTVShowPokemonLotterWinnerFlashReport * DoTVShowThePokemonBattleSeminar * DoTVShowTrainerFanClubSpecial, DoTVShowTrainerFanClub * DoTVShowSpotTheCuties * DoTVShowPokemonNewsBattleFrontier * DoTVShowWhatsNo1InHoennToday * Helpers for DoTVShowSecretBaseSecrets * DoTVShowSecretBaseSecrets * DoTVShowSafariFanClub * Finish decompilation of tv.s * Some renaming * Rename text group pointers * revoke statis; pokenews enums * Labels are number one * Label all TV struct fields * Make data/text/tv.inc more readable * Split data/text/tv.inc * Rename pokenews text pointers * Frontier Symbol constants; indicate static rodata objects with 's' prefix * Fix leading spaces/tabs F*** CLion sometimes * Fix inconsequential warning
2017-10-13 17:09:36 +02:00
#include "tv.h"
2017-09-07 19:45:32 +02:00
#include "coins.h"
2017-09-25 21:27:54 +02:00
#include "text.h"
#include "overworld.h"
#include "mail.h"
#include "battle_records.h"
2018-08-19 01:06:10 +02:00
#include "item.h"
#include "pokedex.h"
2018-10-14 17:00:41 +02:00
#include "apprentice.h"
2018-10-30 21:45:26 +01:00
#include "frontier_util.h"
#include "constants/maps.h"
#include "pokedex.h"
#include "save.h"
#include "link_rfu.h"
#include "main.h"
#include "contest.h"
#include "item_menu.h"
#include "pokemon_storage_system.h"
2019-07-29 16:22:50 +02:00
#include "pokemon_jump.h"
#include "decoration_inventory.h"
#include "secret_base.h"
#include "player_pc.h"
#include "field_specials.h"
2019-03-24 20:45:09 +01:00
#include "berry_powder.h"
2019-03-25 00:13:32 +01:00
#include "mevent.h"
#include "union_room_chat.h"
extern const u8 EventScript_ResetAllMapFlags[];
2017-09-03 22:50:17 +02:00
static void ClearFrontierRecord(void);
static void WarpToTruck(void);
2021-02-25 10:37:25 +01:00
static void ResetMiniGamesRecords(void);
2018-11-19 01:03:14 +01:00
EWRAM_DATA bool8 gDifferentSaveFile = FALSE;
EWRAM_DATA bool8 gEnableContestDebugging = FALSE;
2018-11-19 01:03:14 +01:00
static const struct ContestWinner sContestWinnerPicDummy =
{
.monName = _(""),
.trainerName = _("")
};
2018-11-01 21:31:10 +01:00
void SetTrainerId(u32 trainerId, u8 *dst)
2017-09-03 22:50:17 +02:00
{
2018-11-01 21:31:10 +01:00
dst[0] = trainerId;
dst[1] = trainerId >> 8;
dst[2] = trainerId >> 16;
dst[3] = trainerId >> 24;
2017-09-03 22:50:17 +02:00
}
2018-11-01 21:31:10 +01:00
u32 GetTrainerId(u8 *trainerId)
2017-09-03 22:50:17 +02:00
{
2018-11-01 21:31:10 +01:00
return (trainerId[3] << 24) | (trainerId[2] << 16) | (trainerId[1] << 8) | (trainerId[0]);
2017-09-03 22:50:17 +02:00
}
2018-11-01 21:31:10 +01:00
void CopyTrainerId(u8 *dst, u8 *src)
2017-09-03 22:50:17 +02:00
{
s32 i;
2019-09-08 18:21:24 +02:00
for (i = 0; i < TRAINER_ID_LENGTH; i++)
2018-11-01 21:31:10 +01:00
dst[i] = src[i];
2017-09-03 22:50:17 +02:00
}
static void InitPlayerTrainerId(void)
2017-09-03 22:50:17 +02:00
{
2021-03-30 23:38:09 +02:00
u32 trainerId = (Random() << 16) | GetGeneratedTrainerIdLower();
2018-11-01 21:31:10 +01:00
SetTrainerId(trainerId, gSaveBlock2Ptr->playerTrainerId);
2017-09-03 22:50:17 +02:00
}
// L=A isnt set here for some reason.
static void SetDefaultOptions(void)
2017-09-03 22:50:17 +02:00
{
gSaveBlock2Ptr->optionsTextSpeed = OPTIONS_TEXT_SPEED_MID;
gSaveBlock2Ptr->optionsWindowFrameType = 0;
gSaveBlock2Ptr->optionsSound = OPTIONS_SOUND_MONO;
gSaveBlock2Ptr->optionsBattleStyle = OPTIONS_BATTLE_STYLE_SHIFT;
gSaveBlock2Ptr->optionsBattleSceneOff = FALSE;
gSaveBlock2Ptr->regionMapZoom = FALSE;
}
static void ClearPokedexFlags(void)
2017-09-03 22:50:17 +02:00
{
2019-02-18 07:33:41 +01:00
gUnusedPokedexU8 = 0;
2017-09-03 22:50:17 +02:00
memset(&gSaveBlock2Ptr->pokedex.owned, 0, sizeof(gSaveBlock2Ptr->pokedex.owned));
memset(&gSaveBlock2Ptr->pokedex.seen, 0, sizeof(gSaveBlock2Ptr->pokedex.seen));
}
void ClearAllContestWinnerPics(void)
{
s32 i;
ClearContestWinnerPicsInContestHall();
2021-04-22 20:30:45 +02:00
// Clear Museum paintings
for (i = MUSEUM_CONTEST_WINNERS_START; i < NUM_CONTEST_WINNERS; i++)
gSaveBlock1Ptr->contestWinners[i] = sContestWinnerPicDummy;
2017-09-03 22:50:17 +02:00
}
static void ClearFrontierRecord(void)
2017-09-03 22:50:17 +02:00
{
CpuFill32(0, &gSaveBlock2Ptr->frontier, sizeof(gSaveBlock2Ptr->frontier));
2017-09-03 22:50:17 +02:00
2019-11-24 22:58:40 +01:00
gSaveBlock2Ptr->frontier.opponentNames[0][0] = EOS;
gSaveBlock2Ptr->frontier.opponentNames[1][0] = EOS;
2017-09-03 22:50:17 +02:00
}
static void WarpToTruck(void)
2017-09-03 22:50:17 +02:00
{
2018-12-27 23:30:47 +01:00
SetWarpDestination(MAP_GROUP(INSIDE_OF_TRUCK), MAP_NUM(INSIDE_OF_TRUCK), -1, -1, -1);
WarpIntoMap();
2017-09-03 22:50:17 +02:00
}
void Sav2_ClearSetDefault(void)
{
ClearSav2();
SetDefaultOptions();
}
void ResetMenuAndMonGlobals(void)
2017-09-03 22:50:17 +02:00
{
2021-02-22 01:27:59 +01:00
gDifferentSaveFile = FALSE;
ResetPokedexScrollPositions();
2017-09-03 22:50:17 +02:00
ZeroPlayerPartyMons();
ZeroEnemyPartyMons();
ResetBagScrollPositions();
2017-12-16 00:08:23 +01:00
ResetPokeblockScrollPositions();
2017-09-03 22:50:17 +02:00
}
2017-09-07 19:45:32 +02:00
2017-09-03 22:50:17 +02:00
void NewGameInitData(void)
{
2020-01-12 21:27:37 +01:00
if (gSaveFileStatus == SAVE_STATUS_EMPTY || gSaveFileStatus == SAVE_STATUS_CORRUPT)
2017-09-07 19:45:32 +02:00
RtcReset();
2021-02-22 01:27:59 +01:00
gDifferentSaveFile = TRUE;
2017-09-07 19:45:32 +02:00
gSaveBlock2Ptr->encryptionKey = 0;
ZeroPlayerPartyMons();
ZeroEnemyPartyMons();
ResetPokedex();
ClearFrontierRecord();
2017-09-07 19:45:32 +02:00
ClearSav1();
ClearMailData();
2018-12-27 23:30:47 +01:00
gSaveBlock2Ptr->specialSaveWarpFlags = 0;
2020-04-13 14:42:31 +02:00
gSaveBlock2Ptr->gcnLinkFlags = 0;
2017-09-07 19:45:32 +02:00
InitPlayerTrainerId();
PlayTimeCounter_Reset();
ClearPokedexFlags();
InitEventData();
ClearTVShowData();
ResetGabbyAndTy();
2019-04-05 23:11:24 +02:00
ClearSecretBases();
2017-09-07 19:45:32 +02:00
ClearBerryTrees();
SetMoney(&gSaveBlock1Ptr->money, 3000);
SetCoins(0);
ResetLinkContestBoolean();
ResetGameStats();
ClearAllContestWinnerPics();
ClearPlayerLinkBattleRecords();
2017-09-07 19:45:32 +02:00
InitSeedotSizeRecord();
InitLotadSizeRecord();
gPlayerPartyCount = 0;
ZeroPlayerPartyMons();
ResetPokemonStorageSystem();
ClearRoamerData();
ClearRoamerLocationData();
gSaveBlock1Ptr->registeredItem = 0;
ClearBag();
NewGameInitPCItems();
ClearPokeblocks();
ClearDecorationInventories();
InitEasyChatPhrases();
SetMauvilleOldMan();
InitDewfordTrend();
ResetFanClub();
ResetLotteryCorner();
WarpToTruck();
ScriptContext2_RunNewScript(EventScript_ResetAllMapFlags);
2021-02-25 10:37:25 +01:00
ResetMiniGamesRecords();
2020-06-01 20:05:29 +02:00
InitUnionRoomChatRegisteredTexts();
2019-08-05 05:12:49 +02:00
InitLilycoveLady();
ResetAllApprenticeData();
ClearRankingHallRecords();
2019-01-03 02:07:47 +01:00
InitMatchCallCounters();
ClearMysteryGift();
WipeTrainerNameRecords();
2019-01-13 20:50:08 +01:00
ResetTrainerHillResults();
ResetContestLinkResults();
2017-09-07 19:45:32 +02:00
}
2017-09-08 16:46:37 +02:00
2021-02-25 10:37:25 +01:00
static void ResetMiniGamesRecords(void)
2017-09-08 16:46:37 +02:00
{
CpuFill16(0, &gSaveBlock2Ptr->berryCrush, sizeof(struct BerryCrush));
SetBerryPowder(&gSaveBlock2Ptr->berryCrush.berryPowderAmount, 0);
2021-02-25 10:37:25 +01:00
ResetPokemonJumpRecords();
2017-09-08 16:46:37 +02:00
CpuFill16(0, &gSaveBlock2Ptr->berryPick, sizeof(struct BerryPickingResults));
}