From 0a993ec1d569b8b9ea8941ca43fac2a4444445bd Mon Sep 17 00:00:00 2001 From: AECX Date: Mon, 15 Feb 2021 11:30:32 +0100 Subject: [PATCH] Dirty seed-saving capability but seems to be fine --- include/defines.h | 56 ++++++++++++++++++++++------------------------- include/global.h | 15 +++++++------ source/mod.cpp | 19 +++++++++++++++- source/tools.cpp | 56 +++++++++++++++++++++++++---------------------- 4 files changed, 82 insertions(+), 64 deletions(-) diff --git a/include/defines.h b/include/defines.h index e44f1d45..f6799d53 100644 --- a/include/defines.h +++ b/include/defines.h @@ -5,47 +5,43 @@ using std::size_t; // Data types -typedef unsigned long long u64; -typedef signed long long s64; -typedef unsigned int u32; -typedef signed int s32; -typedef unsigned short u16; -typedef signed short s16; -typedef unsigned char u8; -typedef signed char s8; +typedef unsigned long long u64; +typedef signed long long s64; +typedef unsigned int u32; +typedef signed int s32; +typedef unsigned short u16; +typedef signed short s16; +typedef unsigned char u8; +typedef signed char s8; // Helper #define BYTE_TO_BINARY_PATTERN "%c%c%c%c%c%c%c%c" -#define BYTE_TO_BINARY(byte) \ - (byte & 0b10000000 ? '1' : '0'), \ - (byte & 0b01000000 ? '1' : '0'), \ - (byte & 0b00100000 ? '1' : '0'), \ - (byte & 0b00010000 ? '1' : '0'), \ - (byte & 0b00001000 ? '1' : '0'), \ - (byte & 0b00000100 ? '1' : '0'), \ - (byte & 0b00000010 ? '1' : '0'), \ - (byte & 0b00000001 ? '1' : '0') +#define BYTE_TO_BINARY(byte) \ + (byte & 0b10000000 ? '1' : '0'), (byte & 0b01000000 ? '1' : '0'), (byte & 0b00100000 ? '1' : '0'), \ + (byte & 0b00010000 ? '1' : '0'), (byte & 0b00001000 ? '1' : '0'), (byte & 0b00000100 ? '1' : '0'), \ + (byte & 0b00000010 ? '1' : '0'), (byte & 0b00000001 ? '1' : '0') // Allows to transform data as bytes 1:1 from A<-->B and vice versa template -union typeTransform { - A a; - B b; +union typeTransform +{ + A a; + B b; }; // Array modification -#define MAX_LOAD_EVENTS 40 // eventListener -#define MAX_HUDCONSOLE_PAGES 12 // HUDConsole +#define MAX_LOAD_EVENTS 40 // eventListener +#define MAX_HUDCONSOLE_PAGES 12 // HUDConsole // Mnemonics -#define AUTHOR "ZTPR" -#define VERSION "v0.16.1b" -#define RAND_SEED mod::tools::randomSeed -#define gameInfo tp::d_com_inf_game::dComIfG_gameInfo -#define getPlayerPos tp::d_map_path_dmap::getMapPlayerPos -#define sysConsolePtr tp::jfw_system::systemConsole -#define isLoading tp::f_op_scene_req::isUsingOfOverlap -#define ItemFlags tp::d_com_inf_game::ItemFlagBits +#define AUTHOR "ZTPR" +#define VERSION "v0.16.2b" +#define RAND_SEED mod::tools::randomSeed +#define gameInfo tp::d_com_inf_game::dComIfG_gameInfo +#define getPlayerPos tp::d_map_path_dmap::getMapPlayerPos +#define sysConsolePtr tp::jfw_system::systemConsole +#define isLoading tp::f_op_scene_req::isUsingOfOverlap +#define ItemFlags tp::d_com_inf_game::ItemFlagBits // Stage translations for mod::stage::allStages[] #define Stage_Lakebed_Temple 0 diff --git a/include/global.h b/include/global.h index 59921997..17a3c0b9 100644 --- a/include/global.h +++ b/include/global.h @@ -1,15 +1,16 @@ #pragma once -#include "mod.h" +#include "HUDConsole.h" #include "chestRando.h" #include "eventListener.h" -#include "HUDConsole.h" #include "game_patches.h" +#include "mod.h" namespace mod::global { - extern mod::Mod* modPtr; - extern mod::ChestRandomizer* chestRandoPtr; - extern mod::event::EventListener* eventListenerPtr; - extern mod::HUDConsole* hudConsolePtr; -} \ No newline at end of file + extern mod::Mod* modPtr; + extern mod::ChestRandomizer* chestRandoPtr; + extern mod::event::EventListener* eventListenerPtr; + extern mod::HUDConsole* hudConsolePtr; + extern uint64_t* seedInSaveFile; +} // namespace mod::global \ No newline at end of file diff --git a/source/mod.cpp b/source/mod.cpp index 69b9afac..93b47a26 100644 --- a/source/mod.cpp +++ b/source/mod.cpp @@ -45,6 +45,8 @@ namespace mod ChestRandomizer* global::chestRandoPtr = nullptr; event::EventListener* global::eventListenerPtr = nullptr; mod::HUDConsole* global::hudConsolePtr = nullptr; + uint64_t* global::seedInSaveFile = nullptr; + int num_frames = 120; int frame_counter = 0; @@ -77,6 +79,9 @@ namespace mod // Init rando tools::randomSeed = 0x9e3779b97f4a7c15; + + global::seedInSaveFile = reinterpret_cast(&tp::d_com_inf_game::dComIfG_gameInfo.scratchPad.eponaName[9]); + randoEnabled = 1; truePause = 1; inputBuffering = 0; @@ -86,7 +91,7 @@ namespace mod strcpy(sysConsolePtr->consoleLine[21].line, "+/- Value: A/B/X/Y Console : R + Z"); strcpy(sysConsolePtr->consoleLine[22].line, " Generate: R + Start (auto on new file)"); strcpy(sysConsolePtr->consoleLine[23].line, "Bring up the console to use commands"); - strcpy(sysConsolePtr->consoleLine[24].line, "rando.tpspeed.run | Twitter: @ztprandomizer"); + strcpy(sysConsolePtr->consoleLine[24].line, "rando.zeldatp.net | Twitter: @tprandomizer"); u8 page = 0; @@ -118,6 +123,7 @@ namespace mod // Debug page = hudConsole->addPage("Debug Info"); + hudConsole->addWatch(page, "InSave: ", global::seedInSaveFile, 'x', WatchInterpretation::_u64); hudConsole->addWatch(page, "Function:", &lastItemFunc, 's', WatchInterpretation::_str); hudConsole->addWatch(page, " Source:", &chestRandomizer->lastSourceInfo, 's', WatchInterpretation::_str); hudConsole->addWatch(page, " Dest:", &chestRandomizer->lastDestInfo, 's', WatchInterpretation::_str); @@ -923,6 +929,17 @@ hudConsole->addWatch(page, "throw:", &throwResult, 'x', WatchInterpretation::_u1 if (controller::checkForButtonInputSingleFrame( (controller::PadInputs::Button_R | controller::PadInputs::Button_Start))) { + // Check if we have a seed sitting in our save file somewhere and if so, apply this automatically (unless custom + // seed is turned on) + + if (!customSeed && *global::seedInSaveFile > 0) + { + tools::randomSeed = *global::seedInSaveFile; + } + + // In case this person hasn't started the run through the load event earlier we still have to store this seed + // manually in the save data + *global::seedInSaveFile = tools::randomSeed; chestRandomizer->generate(); } diff --git a/source/tools.cpp b/source/tools.cpp index 8b30184b..93973558 100644 --- a/source/tools.cpp +++ b/source/tools.cpp @@ -23,7 +23,11 @@ namespace mod::tools void triggerRandomGenerator() { - sprintf(sysConsolePtr->consoleLine[12].line, "New rando"); + // This function runs when the user starts a new file (intro cs is running) + // We do it the dirty way and store the seed behind Epona's name (hehe xd) + // With 1.0 this will change anyway so I really don't care and it improves QoL for players! + + *global::seedInSaveFile = tools::randomSeed; global::chestRandoPtr->generate(); } @@ -83,30 +87,30 @@ namespace mod::tools return (sum2 << 8) | sum1; } - void setItemFlag(ItemFlags flag) - { - u32 flagsPerVar = sizeof(u32) * 8; - u32 tempFlagVar = static_cast(flag); - - u32* tempItemFlagsArray = gameInfo.scratchPad.itemFlags; - tempItemFlagsArray[tempFlagVar / flagsPerVar] |= 1 << (tempFlagVar % flagsPerVar); - } - - void clearItemFlag(ItemFlags flag) - { - u32 flagsPerVar = sizeof(u32) * 8; - u32 tempFlagVar = static_cast(flag); - - u32* tempItemFlagsArray = gameInfo.scratchPad.itemFlags; - tempItemFlagsArray[tempFlagVar / flagsPerVar] &= ~(1 << (tempFlagVar % flagsPerVar)); - } - - bool checkItemFlag(ItemFlags flag) - { - u32 flagsPerVar = sizeof(u32) * 8; - u32 tempFlagVar = static_cast(flag); - - u32* tempItemFlagsArray = gameInfo.scratchPad.itemFlags; - return tempItemFlagsArray[tempFlagVar / flagsPerVar] & (1 << (tempFlagVar % flagsPerVar)); + void setItemFlag(ItemFlags flag) + { + u32 flagsPerVar = sizeof(u32) * 8; + u32 tempFlagVar = static_cast(flag); + + u32* tempItemFlagsArray = gameInfo.scratchPad.itemFlags; + tempItemFlagsArray[tempFlagVar / flagsPerVar] |= 1 << (tempFlagVar % flagsPerVar); + } + + void clearItemFlag(ItemFlags flag) + { + u32 flagsPerVar = sizeof(u32) * 8; + u32 tempFlagVar = static_cast(flag); + + u32* tempItemFlagsArray = gameInfo.scratchPad.itemFlags; + tempItemFlagsArray[tempFlagVar / flagsPerVar] &= ~(1 << (tempFlagVar % flagsPerVar)); + } + + bool checkItemFlag(ItemFlags flag) + { + u32 flagsPerVar = sizeof(u32) * 8; + u32 tempFlagVar = static_cast(flag); + + u32* tempItemFlagsArray = gameInfo.scratchPad.itemFlags; + return tempItemFlagsArray[tempFlagVar / flagsPerVar] & (1 << (tempFlagVar % flagsPerVar)); } } \ No newline at end of file