Skip to content

Commit

Permalink
Dirty seed-saving capability but seems to be fine
Browse files Browse the repository at this point in the history
  • Loading branch information
AECX committed Feb 15, 2021
1 parent 7bdfb16 commit 0a993ec
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 64 deletions.
56 changes: 26 additions & 30 deletions include/defines.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 <typename A, typename B>
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
Expand Down
15 changes: 8 additions & 7 deletions include/global.h
Original file line number Diff line number Diff line change
@@ -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;
}
extern mod::Mod* modPtr;
extern mod::ChestRandomizer* chestRandoPtr;
extern mod::event::EventListener* eventListenerPtr;
extern mod::HUDConsole* hudConsolePtr;
extern uint64_t* seedInSaveFile;
} // namespace mod::global
19 changes: 18 additions & 1 deletion source/mod.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -77,6 +79,9 @@ namespace mod

// Init rando
tools::randomSeed = 0x9e3779b97f4a7c15;

global::seedInSaveFile = reinterpret_cast<u64*>(&tp::d_com_inf_game::dComIfG_gameInfo.scratchPad.eponaName[9]);

randoEnabled = 1;
truePause = 1;
inputBuffering = 0;
Expand All @@ -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;

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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();
}

Expand Down
56 changes: 30 additions & 26 deletions source/tools.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

Expand Down Expand Up @@ -83,30 +87,30 @@ namespace mod::tools
return (sum2 << 8) | sum1;
}

void setItemFlag(ItemFlags flag)
{
u32 flagsPerVar = sizeof(u32) * 8;
u32 tempFlagVar = static_cast<u32>(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<u32>(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<u32>(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<u32>(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<u32>(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<u32>(flag);

u32* tempItemFlagsArray = gameInfo.scratchPad.itemFlags;
return tempItemFlagsArray[tempFlagVar / flagsPerVar] & (1 << (tempFlagVar % flagsPerVar));
}
}

0 comments on commit 0a993ec

Please sign in to comment.