Shipwright/soh/soh/Enhancements/randomizer/3drando/playthrough.cpp

98 lines
2.9 KiB
C++

#include "playthrough.hpp"
#include "custom_messages.hpp"
#include "fill.hpp"
#include "location_access.hpp"
#include "logic.hpp"
#include "random.hpp"
#include "spoiler_log.hpp"
#include "soh/Enhancements/randomizer/randomizerTypes.h"
namespace Playthrough {
int Playthrough_Init(uint32_t seed, std::unordered_map<RandomizerSettingKey, uint8_t> cvarSettings, std::set<RandomizerCheck> excludedLocations) {
// initialize the RNG with just the seed incase any settings need to be
// resolved to something random
Random_Init(seed);
overrides.clear();
CustomMessages::ClearMessages();
ItemReset();
HintReset();
Areas::AccessReset();
Settings::UpdateSettings(cvarSettings, excludedLocations);
// once the settings have been finalized turn them into a string for hashing
std::string settingsStr;
for (Menu* menu : Settings::GetAllOptionMenus()) {
// don't go through non-menus
if (menu->mode != OPTION_SUB_MENU) {
continue;
}
for (size_t i = 0; i < menu->settingsList->size(); i++) {
Option* setting = menu->settingsList->at(i);
if (setting->IsCategory(OptionCategory::Setting)) {
settingsStr += setting->GetSelectedOptionText();
}
}
}
unsigned int finalHash = std::hash<std::string>{}(Settings::seed + settingsStr);
Random_Init(finalHash);
Settings::hash = std::to_string(finalHash);
Logic::UpdateHelpers();
if (Settings::Logic.Is(LOGIC_VANILLA)) {
VanillaFill(); // Just place items in their vanilla locations
} else { // Fill locations with logic
int ret = Fill();
if (ret < 0) {
return ret;
}
}
GenerateHash();
WriteIngameSpoilerLog();
if (Settings::GenerateSpoilerLog) {
// write logs
printf("\x1b[11;10HWriting Spoiler Log...");
if (SpoilerLog_Write(cvarSettings[RSK_LANGUAGE])) {
printf("Done");
} else {
printf("Failed");
}
#ifdef ENABLE_DEBUG
printf("\x1b[11;10HWriting Placement Log...");
if (PlacementLog_Write()) {
printf("Done\n");
} else {
printf("Failed\n");
}
#endif
}
playthroughLocations.clear();
wothLocations.clear();
playthroughBeatable = false;
return 1;
}
// used for generating a lot of seeds at once
int Playthrough_Repeat(int count /*= 1*/) {
printf("\x1b[0;0HGENERATING %d SEEDS", count);
uint32_t repeatedSeed = 0;
for (int i = 0; i < count; i++) {
repeatedSeed = rand() % 0xFFFFFFFF;
Settings::seed = std::to_string(repeatedSeed);
CitraPrint("testing seed: " + Settings::seed);
ClearProgress();
// Playthrough_Init(std::hash<std::string>{}(Settings::seed));
printf("\x1b[15;15HSeeds Generated: %d\n", i + 1);
}
return 1;
}
} // namespace Playthrough