rando generation working, but lots of incorrect check strings

This commit is contained in:
MelonSpeedruns 2022-06-01 17:58:20 -04:00
commit 25706073ff
10 changed files with 47 additions and 20 deletions

View file

@ -9,7 +9,6 @@
#include <Lib/spdlog/include/spdlog/spdlog.h> #include <Lib/spdlog/include/spdlog/spdlog.h>
//Location definitions //Location definitions
static std::array<ItemLocation, KEY_ENUM_MAX> locationTable;
void LocationTable_Init() { void LocationTable_Init() {
locationTable[NONE] = ItemLocation::Base (0xFF, 0xFF, "Invalid Location", NONE, NONE, {}, SpoilerCollectionCheck::None()); locationTable[NONE] = ItemLocation::Base (0xFF, 0xFF, "Invalid Location", NONE, NONE, {}, SpoilerCollectionCheck::None());
@ -911,8 +910,8 @@ void LocationTable_Init() {
locationTable[DMC_UPPER_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x3A, "DMC Upper Grotto Gossip Stone", {}); locationTable[DMC_UPPER_GROTTO_GOSSIP_STONE] = ItemLocation::HintStone(0x00, 0x3A, "DMC Upper Grotto Gossip Stone", {});
locationTable[GANONDORF_HINT] = ItemLocation::OtherHint(0x00, 0x00, "Ganondorf Hint", {}); locationTable[GANONDORF_HINT] = ItemLocation::OtherHint(0x00, 0x00, "Ganondorf Hint", {});
} }
std::vector<uint32_t> KF_ShopLocations = { std::vector<uint32_t> KF_ShopLocations = {
KF_SHOP_ITEM_1, KF_SHOP_ITEM_1,
KF_SHOP_ITEM_2, KF_SHOP_ITEM_2,

View file

@ -515,14 +515,14 @@ void PrintOptionDescription() {
printf("\x1b[22;0H%s", description.data()); printf("\x1b[22;0H%s", description.data());
} }
void GenerateRandomizer() { std::string GenerateRandomizer() {
// if a blank seed was entered, make a random one // if a blank seed was entered, make a random one
if (Settings::seed.empty()) { if (Settings::seed.empty()) {
Settings::seed = std::to_string(rand()); Settings::seed = std::to_string(rand());
} else if (Settings::seed.rfind("seed_testing_count", 0) == 0) { } else if (Settings::seed.rfind("seed_testing_count", 0) == 0) {
const int count = std::stoi(Settings::seed.substr(18), nullptr); const int count = std::stoi(Settings::seed.substr(18), nullptr);
Playthrough::Playthrough_Repeat(count); Playthrough::Playthrough_Repeat(count);
return; return "";
} }
int ret = Playthrough::Playthrough_Init(std::hash<std::string>{}(Settings::seed)); int ret = Playthrough::Playthrough_Init(std::hash<std::string>{}(Settings::seed));
@ -531,10 +531,10 @@ void GenerateRandomizer() {
printf("\n\nFailed to generate after 5 tries.\nPress B to go back to the menu.\nA different seed might be " printf("\n\nFailed to generate after 5 tries.\nPress B to go back to the menu.\nA different seed might be "
"successful."); "successful.");
SPDLOG_INFO("\nRANDOMIZATION FAILED COMPLETELY. PLZ FIX\n"); SPDLOG_INFO("\nRANDOMIZATION FAILED COMPLETELY. PLZ FIX\n");
return; return "";
} else { } else {
printf("\n\nError %d with fill.\nPress Select to exit or B to go back to the menu.\n", ret); printf("\n\nError %d with fill.\nPress Select to exit or B to go back to the menu.\n", ret);
return; return "";
} }
} }
@ -545,6 +545,8 @@ void GenerateRandomizer() {
} }
Settings::Keysanity.RestoreDelayedOption(); Settings::Keysanity.RestoreDelayedOption();
} }
return "./randomizer/" + Settings::seed + ".json";
} }
std::string GetInput(const char* hintText) { std::string GetInput(const char* hintText) {

View file

@ -43,7 +43,7 @@ void PrintResetToDefaultsMenu();
void PrintGenerateMenu(); void PrintGenerateMenu();
void ClearDescription(); void ClearDescription();
void PrintOptionDescription(); void PrintOptionDescription();
void GenerateRandomizer(); std::string GenerateRandomizer();
std::string GetInput(const char* hintText); std::string GetInput(const char* hintText);
extern void MenuInit(); extern void MenuInit();

View file

@ -4,6 +4,9 @@
#include "item_location.hpp" #include "item_location.hpp"
#include "location_access.hpp" #include "location_access.hpp"
#include "rando_main.hpp" #include "rando_main.hpp"
#include <soh/Enhancements/randomizer.h>
#include <Cvar.h>
#include <GameSettings.h>
#define TICKS_PER_SEC 268123480.0 #define TICKS_PER_SEC 268123480.0
@ -11,5 +14,8 @@ void RandoMain::GenerateRando() {
HintTable_Init(); HintTable_Init();
ItemTable_Init(); ItemTable_Init();
LocationTable_Init(); LocationTable_Init();
GenerateRandomizer();
std::string fileName = GenerateRandomizer();
CVar_SetString("gSpoilerLog", fileName.c_str());
Game::SaveSettings();
} }

View file

@ -19,6 +19,11 @@
#include <string> #include <string>
#include <unordered_map> #include <unordered_map>
#include <vector> #include <vector>
#include <json.hpp>
#include <iostream>
#include <fstream>
using json = nlohmann::json;
namespace { namespace {
std::string placementtxt; std::string placementtxt;
@ -572,19 +577,22 @@ static void WriteHints(tinyxml2::XMLDocument& spoilerLog) {
spoilerLog.RootElement()->InsertEndChild(parentNode); spoilerLog.RootElement()->InsertEndChild(parentNode);
} }
static void WriteAllLocations(tinyxml2::XMLDocument& spoilerLog) { static void WriteAllLocations() {
auto parentNode = spoilerLog.NewElement("all-locations"); json jsonLocations;
for (const uint32_t key : allLocations) { for (const uint32_t key : allLocations) {
if (!Location(key)->IsHidden()) { ItemLocation* location = Location(key);
WriteLocation(parentNode, key, true); jsonLocations["locations"][location->GetName()] = location->GetPlacedItemName().english;
}
} }
spoilerLog.RootElement()->InsertEndChild(parentNode); std::string jsonString = jsonLocations.dump();
std::ofstream jsonFile("./randomizer/" + Settings::seed + ".json");
jsonFile << std::setw(4) << jsonString << std::endl;
jsonFile.close();
} }
bool SpoilerLog_Write() { const char* SpoilerLog_Write() {
auto spoilerLog = tinyxml2::XMLDocument(false); auto spoilerLog = tinyxml2::XMLDocument(false);
spoilerLog.InsertEndChild(spoilerLog.NewDeclaration()); spoilerLog.InsertEndChild(spoilerLog.NewDeclaration());
@ -613,10 +621,11 @@ bool SpoilerLog_Write() {
WriteHints(spoilerLog); WriteHints(spoilerLog);
WriteShuffledEntrances(spoilerLog); WriteShuffledEntrances(spoilerLog);
WriteAllLocations(spoilerLog); WriteAllLocations();
auto e = spoilerLog.SaveFile(GetSpoilerLogPath()); auto e = spoilerLog.SaveFile(GetSpoilerLogPath());
return e == tinyxml2::XML_SUCCESS;
return Settings::seed.c_str();
} }
void PlacementLog_Msg(std::string_view msg) { void PlacementLog_Msg(std::string_view msg) {

View file

@ -107,5 +107,5 @@ const RandomizerHash& GetRandomizerHash();
void WriteIngameSpoilerLog(); void WriteIngameSpoilerLog();
bool SpoilerLog_Write(); const char* SpoilerLog_Write();
const SpoilerData& GetSpoilerData(); const SpoilerData& GetSpoilerData();

View file

@ -88,6 +88,7 @@ Randomizer::~Randomizer() {
std::unordered_map<std::string, RandomizerCheck> SpoilerfileCheckNameToEnum = { std::unordered_map<std::string, RandomizerCheck> SpoilerfileCheckNameToEnum = {
{"Links Pocket", RC_LINKS_POCKET}, {"Links Pocket", RC_LINKS_POCKET},
{"Link's Pocket", RC_LINKS_POCKET },
{"Queen Gohma", RC_QUEEN_GOHMA}, {"Queen Gohma", RC_QUEEN_GOHMA},
{"King Dodongo", RC_KING_DODONGO}, {"King Dodongo", RC_KING_DODONGO},
{"Barinade", RC_BARINADE}, {"Barinade", RC_BARINADE},
@ -1169,6 +1170,7 @@ std::string sanitize(std::string stringValue) {
void Randomizer::ParseItemLocationsFile(const char* spoilerFileName) { void Randomizer::ParseItemLocationsFile(const char* spoilerFileName) {
// todo pull this in from cvar or something // todo pull this in from cvar or something
std::ifstream spoilerFileStream(sanitize(spoilerFileName)); std::ifstream spoilerFileStream(sanitize(spoilerFileName));
if (!spoilerFileStream) if (!spoilerFileStream)
return; return;

View file

@ -1029,6 +1029,10 @@ extern "C" s16 GetItemModelFromId(s16 itemId) {
return OTRGlobals::Instance->gRandomizer->GetItemModelFromId(itemId); return OTRGlobals::Instance->gRandomizer->GetItemModelFromId(itemId);
} }
extern "C" void LoadItemLocations(const char* spoilerFileName) {
OTRGlobals::Instance->gRandomizer->LoadItemLocations(spoilerFileName);
}
extern "C" void ParseItemLocationsFile(const char* spoilerFileName) { extern "C" void ParseItemLocationsFile(const char* spoilerFileName) {
OTRGlobals::Instance->gRandomizer->ParseItemLocationsFile(spoilerFileName); OTRGlobals::Instance->gRandomizer->ParseItemLocationsFile(spoilerFileName);
} }

View file

@ -76,7 +76,8 @@ int AudioPlayer_GetDesiredBuffered(void);
void AudioPlayer_Play(const uint8_t* buf, uint32_t len); void AudioPlayer_Play(const uint8_t* buf, uint32_t len);
void AudioMgr_CreateNextAudioBuffer(s16* samples, u32 num_samples); void AudioMgr_CreateNextAudioBuffer(s16* samples, u32 num_samples);
int Controller_ShouldRumble(size_t i); int Controller_ShouldRumble(size_t i);
void ParseItemLocationsFile(const char* spoilerfilename); void LoadItemLocations(const char* spoilerFileName);
void ParseItemLocationsFile(const char* spoilerFileName);
s16 GetItemModelFromId(s16 itemId); s16 GetItemModelFromId(s16 itemId);
s32 GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum); s32 GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum);
s32 GetRandomizedItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId); s32 GetRandomizedItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId);

View file

@ -1511,6 +1511,7 @@ void FileChoose_FadeOut(GameState* thisx) {
* Note: On Debug ROM, File 1 will go to Map Select. * Note: On Debug ROM, File 1 will go to Map Select.
* Update function for `SM_LOAD_GAME` * Update function for `SM_LOAD_GAME`
*/ */
void FileChoose_LoadGame(GameState* thisx) { void FileChoose_LoadGame(GameState* thisx) {
FileChooseContext* this = (FileChooseContext*)thisx; FileChooseContext* this = (FileChooseContext*)thisx;
u16 swordEquipMask; u16 swordEquipMask;
@ -1533,6 +1534,9 @@ void FileChoose_LoadGame(GameState* thisx) {
this->state.running = false; this->state.running = false;
} }
const char* fileLoc = CVar_GetString("gSpoilerLog", "");
LoadItemLocations(fileLoc);
gSaveContext.respawn[0].entranceIndex = -1; gSaveContext.respawn[0].entranceIndex = -1;
gSaveContext.respawnFlag = 0; gSaveContext.respawnFlag = 0;
gSaveContext.seqId = (u8)NA_BGM_DISABLED; gSaveContext.seqId = (u8)NA_BGM_DISABLED;