From 55c070dbdd7ecc0c44718e9d622b526da10ce0e2 Mon Sep 17 00:00:00 2001 From: Philippe Symons Date: Tue, 4 Mar 2025 20:21:08 +0100 Subject: [PATCH] In addition to the other stuff I already did, use the RTC values to seed the RNG MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We were already using the entropy generated by the libdragon bootloader, trainer id, trainer name and the number of cpu ticks before we loaded the main menu to seed the random number generator. Now -for gen II- I also grab the current RTC values and add them to this RNG seed. This should theoretically give us enough entropy to guarantuee random values for mystery gift and shiny pokémon chances. --- src/scenes/InitTransferPakScene.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/scenes/InitTransferPakScene.cpp b/src/scenes/InitTransferPakScene.cpp index 2b03888..5611cf9 100755 --- a/src/scenes/InitTransferPakScene.cpp +++ b/src/scenes/InitTransferPakScene.cpp @@ -4,6 +4,7 @@ #include "transferpak/TransferPakManager.h" #include "transferpak/TransferPakRomReader.h" #include "transferpak/TransferPakSaveManager.h" +#include "transferpak/TransferPakRTCReader.h" #include "gen1/Gen1GameReader.h" #include "gen2/Gen2GameReader.h" #include "menu/MenuEntries.h" @@ -288,6 +289,7 @@ void InitTransferPakScene::loadSaveMetadata() { TransferPakRomReader romReader(deps_.tpakManager); TransferPakSaveManager saveManager(deps_.tpakManager); + TransferPakRTCReader rtcReader(deps_.tpakManager); Gen1GameType gen1Type; Gen2GameType gen2Type; uint16_t trainerID = 0; @@ -307,8 +309,16 @@ void InitTransferPakScene::loadSaveMetadata() else if(gen2Type != Gen2GameType::INVALID) { const Gen2LocalizationLanguage language = gen2_determineGameLanguage(romReader, gen2Type); - Gen2GameReader gameReader(romReader, saveManager, gen2Type, language); + Gen2ClockManager clockManager = gameReader.getClockManager(rtcReader); + + // add more entropy to the randomSeed by adding the current daycounter + time to it. + clockManager.latchRTC(); + randomSeed_ += (static_cast(clockManager.getDayCounter() & 0xFF) << 24); + randomSeed_ += (static_cast(clockManager.getHours()) << 16); + randomSeed_ += (static_cast(clockManager.getMinutes()) << 8); + randomSeed_ += static_cast(clockManager.getSeconds()); + const char* trainerName = gameReader.getTrainerName(); trainerID = gameReader.getTrainerID(); deps_.localization = static_cast(language);