mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2024-11-26 19:32:17 -05:00
Added save filename and path to config file (#130)
* Added save filename and path to config file Closes #110 * Moved FileIO to libultraship * Moved OOT Specific Code to OTRGlobals and made libultraship for general file IO. Combined config options. * Moved filesystem include into GlobalCtx2.h
This commit is contained in:
parent
36b9b9519d
commit
39d8b77b02
@ -59,6 +59,8 @@ namespace Ship {
|
|||||||
(*this)["ARCHIVE"]["Main Archive"] = "oot.otr";
|
(*this)["ARCHIVE"]["Main Archive"] = "oot.otr";
|
||||||
(*this)["ARCHIVE"]["Patches Directory"] = "";
|
(*this)["ARCHIVE"]["Patches Directory"] = "";
|
||||||
|
|
||||||
|
(*this)["SAVE"]["Save Filename"] = "oot_save.sav";
|
||||||
|
|
||||||
(*this)["CONTROLLERS"]["CONTROLLER 1"] = "Auto";
|
(*this)["CONTROLLERS"]["CONTROLLER 1"] = "Auto";
|
||||||
(*this)["CONTROLLERS"]["CONTROLLER 2"] = "Unplugged";
|
(*this)["CONTROLLERS"]["CONTROLLER 2"] = "Unplugged";
|
||||||
(*this)["CONTROLLERS"]["CONTROLLER 3"] = "Unplugged";
|
(*this)["CONTROLLERS"]["CONTROLLER 3"] = "Unplugged";
|
||||||
|
@ -86,4 +86,25 @@ namespace Ship {
|
|||||||
std::cout << "Log initialization failed: " << ex.what() << std::endl;
|
std::cout << "Log initialization failed: " << ex.what() << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GlobalCtx2::WriteSaveFile(std::filesystem::path savePath, uintptr_t addr, void* dramAddr, size_t size) {
|
||||||
|
std::ofstream saveFile = std::ofstream(savePath, std::fstream::in | std::fstream::out | std::fstream::binary);
|
||||||
|
saveFile.seekp(addr);
|
||||||
|
saveFile.write((char*)dramAddr, size);
|
||||||
|
saveFile.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
void GlobalCtx2::ReadSaveFile(std::filesystem::path savePath, uintptr_t addr, void* dramAddr, size_t size) {
|
||||||
|
std::ifstream saveFile = std::ifstream(savePath, std::fstream::in | std::fstream::out | std::fstream::binary);
|
||||||
|
|
||||||
|
// If the file doesn't exist, initialize DRAM
|
||||||
|
if (saveFile.good()) {
|
||||||
|
saveFile.seekg(addr);
|
||||||
|
saveFile.read((char*)dramAddr, size);
|
||||||
|
} else {
|
||||||
|
memset(dramAddr, 0, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
saveFile.close();
|
||||||
|
}
|
||||||
}
|
}
|
@ -4,6 +4,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
#include <filesystem>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include "spdlog/spdlog.h"
|
#include "spdlog/spdlog.h"
|
||||||
#include "ConfigFile.h"
|
#include "ConfigFile.h"
|
||||||
@ -23,6 +24,9 @@ namespace Ship {
|
|||||||
std::shared_ptr<spdlog::logger> GetLogger() { return Logger; }
|
std::shared_ptr<spdlog::logger> GetLogger() { return Logger; }
|
||||||
std::shared_ptr<ConfigFile> GetConfig() { return Config; }
|
std::shared_ptr<ConfigFile> GetConfig() { return Config; }
|
||||||
|
|
||||||
|
void WriteSaveFile(std::filesystem::path savePath, uintptr_t addr, void* dramAddr, size_t size);
|
||||||
|
void ReadSaveFile(std::filesystem::path savePath, uintptr_t addr, void* dramAddr, size_t size);
|
||||||
|
|
||||||
GlobalCtx2(const std::string& Name);
|
GlobalCtx2(const std::string& Name);
|
||||||
~GlobalCtx2();
|
~GlobalCtx2();
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include "OTRGlobals.h"
|
#include "OTRGlobals.h"
|
||||||
#include "OTRAudio.h"
|
#include "OTRAudio.h"
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <filesystem>
|
||||||
#include <locale>
|
#include <locale>
|
||||||
#include <codecvt>
|
#include <codecvt>
|
||||||
#include "GlobalCtx2.h"
|
#include "GlobalCtx2.h"
|
||||||
@ -46,6 +47,7 @@ OTRGlobals::OTRGlobals() {
|
|||||||
context = Ship::GlobalCtx2::CreateInstance("Ship of Harkinian");
|
context = Ship::GlobalCtx2::CreateInstance("Ship of Harkinian");
|
||||||
gSaveStateMgr = std::make_shared<SaveStateMgr>();
|
gSaveStateMgr = std::make_shared<SaveStateMgr>();
|
||||||
context->GetWindow()->Init();
|
context->GetWindow()->Init();
|
||||||
|
CheckSaveFile(SRAM_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
OTRGlobals::~OTRGlobals() {
|
OTRGlobals::~OTRGlobals() {
|
||||||
@ -840,6 +842,7 @@ extern "C" AnimationHeaderCommon* ResourceMgr_LoadAnimByName(const char* path) {
|
|||||||
for (int i = 0; i < res->rotationValues.size(); i++)
|
for (int i = 0; i < res->rotationValues.size(); i++)
|
||||||
animNormal->frameData[i] = res->rotationValues[i];
|
animNormal->frameData[i] = res->rotationValues[i];
|
||||||
|
|
||||||
|
|
||||||
animNormal->jointIndices = (JointIndex*)malloc(res->rotationIndices.size() * sizeof(Vec3s));
|
animNormal->jointIndices = (JointIndex*)malloc(res->rotationIndices.size() * sizeof(Vec3s));
|
||||||
|
|
||||||
for (int i = 0; i < res->rotationIndices.size(); i++) {
|
for (int i = 0; i < res->rotationIndices.size(); i++) {
|
||||||
@ -1084,6 +1087,71 @@ extern "C" s32* ResourceMgr_LoadCSByName(const char* path)
|
|||||||
return (s32*)res->commands.data();
|
return (s32*)res->commands.data();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::filesystem::path GetSaveFile(Ship::ConfigFile& Conf) {
|
||||||
|
std::string fileName = Conf.get("SAVE").get("Save Filename");
|
||||||
|
|
||||||
|
if (fileName.empty()) {
|
||||||
|
Conf["SAVE"]["Save Filename"] = "oot_save.sav";
|
||||||
|
Conf.Save();
|
||||||
|
}
|
||||||
|
std::filesystem::path saveFile = std::filesystem::absolute(fileName);
|
||||||
|
|
||||||
|
if (!std::filesystem::exists(saveFile.parent_path())) {
|
||||||
|
std::filesystem::create_directories(saveFile.parent_path());
|
||||||
|
}
|
||||||
|
|
||||||
|
return saveFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::filesystem::path GetSaveFile() {
|
||||||
|
std::shared_ptr<Ship::ConfigFile> pConf = OTRGlobals::Instance->context->GetConfig();
|
||||||
|
Ship::ConfigFile& Conf = *pConf.get();
|
||||||
|
|
||||||
|
return GetSaveFile(Conf);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OTRGlobals::CheckSaveFile(size_t sramSize) {
|
||||||
|
std::shared_ptr<Ship::ConfigFile> pConf = context->GetConfig();
|
||||||
|
Ship::ConfigFile& Conf = *pConf.get();
|
||||||
|
|
||||||
|
std::filesystem::path savePath = GetSaveFile(Conf);
|
||||||
|
std::fstream saveFile(savePath, std::fstream::in | std::fstream::out | std::fstream::binary);
|
||||||
|
if (saveFile.fail()) {
|
||||||
|
saveFile.open(savePath, std::fstream::in | std::fstream::out | std::fstream::binary | std::fstream::app);
|
||||||
|
for (int i = 0; i < sramSize; ++i) {
|
||||||
|
saveFile.write("\0", 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
saveFile.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void Ctx_ReadSaveFile(uintptr_t addr, void* dramAddr, size_t size) {
|
||||||
|
OTRGlobals::Instance->context->ReadSaveFile(GetSaveFile(), addr, dramAddr, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void Ctx_WriteSaveFile(uintptr_t addr, void* dramAddr, size_t size) {
|
||||||
|
OTRGlobals::Instance->context->WriteSaveFile(GetSaveFile(), addr, dramAddr, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remember to free after use of value */
|
||||||
|
extern "C" char* Config_getValue(char* category, char* key) {
|
||||||
|
std::shared_ptr<Ship::ConfigFile> pConf = OTRGlobals::Instance->context->GetConfig();
|
||||||
|
Ship::ConfigFile& Conf = *pConf.get();
|
||||||
|
|
||||||
|
std::string data = Conf.get(std::string(category)).get(std::string(key));
|
||||||
|
char* retval = (char*)malloc(data.length()+1);
|
||||||
|
strcpy(retval, data.c_str());
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" bool Config_setValue(char* category, char* key, char* value) {
|
||||||
|
std::shared_ptr<Ship::ConfigFile> pConf = OTRGlobals::Instance->context->GetConfig();
|
||||||
|
Ship::ConfigFile& Conf = *pConf.get();
|
||||||
|
Conf[std::string(category)][std::string(key)] = std::string(value);
|
||||||
|
return Conf.Save();
|
||||||
|
}
|
||||||
|
|
||||||
std::wstring StringToU16(const std::string& s) {
|
std::wstring StringToU16(const std::string& s) {
|
||||||
std::vector<unsigned long> result;
|
std::vector<unsigned long> result;
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
@ -20,7 +20,7 @@ public:
|
|||||||
~OTRGlobals();
|
~OTRGlobals();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void CheckSaveFile(size_t sramSize);
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -47,11 +47,17 @@ Gfx* ResourceMgr_LoadGfxByCRC(uint64_t crc);
|
|||||||
Gfx* ResourceMgr_LoadGfxByName(const char* path);
|
Gfx* ResourceMgr_LoadGfxByName(const char* path);
|
||||||
Gfx* ResourceMgr_PatchGfxByName(const char* path, int size);
|
Gfx* ResourceMgr_PatchGfxByName(const char* path, int size);
|
||||||
Vtx* ResourceMgr_LoadVtxByCRC(uint64_t crc);
|
Vtx* ResourceMgr_LoadVtxByCRC(uint64_t crc);
|
||||||
|
|
||||||
Vtx* ResourceMgr_LoadVtxByName(const char* path);
|
Vtx* ResourceMgr_LoadVtxByName(const char* path);
|
||||||
SoundFont* ResourceMgr_LoadAudioSoundFont(const char* path);
|
SoundFont* ResourceMgr_LoadAudioSoundFont(const char* path);
|
||||||
SequenceData ResourceMgr_LoadSeqByName(const char* path);
|
SequenceData ResourceMgr_LoadSeqByName(const char* path);
|
||||||
SoundFontSample* ResourceMgr_LoadAudioSample(const char* path);
|
SoundFontSample* ResourceMgr_LoadAudioSample(const char* path);
|
||||||
CollisionHeader* ResourceMgr_LoadColByName(const char* path);
|
CollisionHeader* ResourceMgr_LoadColByName(const char* path);
|
||||||
|
void Ctx_ReadSaveFile(uintptr_t addr, void* dramAddr, size_t size);
|
||||||
|
void Ctx_WriteSaveFile(uintptr_t addr, void* dramAddr, size_t size);
|
||||||
|
char* Config_getValue(char* category, char* key);
|
||||||
|
bool Config_setValue(char* category, char* key, char* value);
|
||||||
|
|
||||||
uint64_t GetPerfCounter();
|
uint64_t GetPerfCounter();
|
||||||
struct SkeletonHeader* ResourceMgr_LoadSkeletonByName(const char* path);
|
struct SkeletonHeader* ResourceMgr_LoadSkeletonByName(const char* path);
|
||||||
int ResourceMgr_OTRSigCheck(char* imgData);
|
int ResourceMgr_OTRSigCheck(char* imgData);
|
||||||
|
@ -58,38 +58,13 @@ void SsSram_Dma(void* dramAddr, size_t size, s32 direction) {
|
|||||||
|
|
||||||
void SsSram_ReadWrite(uintptr_t addr, void* dramAddr, size_t size, s32 direction) {
|
void SsSram_ReadWrite(uintptr_t addr, void* dramAddr, size_t size, s32 direction) {
|
||||||
osSyncPrintf("ssSRAMReadWrite:%08x %08x %08x %d\n", addr, (uintptr_t)dramAddr, size, direction);
|
osSyncPrintf("ssSRAMReadWrite:%08x %08x %08x %d\n", addr, (uintptr_t)dramAddr, size, direction);
|
||||||
//Check to see if the file exists
|
|
||||||
FILE* saveFile;
|
|
||||||
saveFile = fopen("oot_save.sav", "rb");
|
|
||||||
|
|
||||||
if (saveFile == NULL) {
|
|
||||||
|
|
||||||
saveFile = fopen("oot_save.sav", "wb");
|
|
||||||
fseek(saveFile, 0, SEEK_SET);
|
|
||||||
assert(saveFile != NULL); // OTRTODO LOG
|
|
||||||
uint8_t zero = 0;
|
|
||||||
|
|
||||||
for (uint32_t i = 0; i < SRAM_SIZE; i++) {
|
|
||||||
fwrite(&zero, 1, 1, saveFile);
|
|
||||||
}
|
|
||||||
fclose(saveFile);
|
|
||||||
} else {
|
|
||||||
fclose(saveFile);
|
|
||||||
}
|
|
||||||
switch (direction) {
|
switch (direction) {
|
||||||
case OS_WRITE: {
|
case OS_WRITE: {
|
||||||
saveFile = fopen("oot_save.sav", "r+b");
|
Ctx_WriteSaveFile(addr, dramAddr, size);
|
||||||
rewind(saveFile);
|
|
||||||
fseek(saveFile, addr, SEEK_SET);
|
|
||||||
fwrite(dramAddr, size, 1, saveFile);
|
|
||||||
fclose(saveFile);
|
|
||||||
} break;
|
} break;
|
||||||
case OS_READ: {
|
case OS_READ: {
|
||||||
saveFile = fopen("oot_save.sav", "rb+");
|
Ctx_ReadSaveFile(addr, dramAddr, size);
|
||||||
rewind(saveFile);
|
|
||||||
fseek(saveFile, addr, SEEK_SET);
|
|
||||||
fread(dramAddr, size, 1, saveFile);
|
|
||||||
fclose(saveFile);
|
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
//SsSram_Init(addr, DEVICE_TYPE_SRAM, PI_DOMAIN2, 5, 0xD, 2, 0xC, 0);
|
//SsSram_Init(addr, DEVICE_TYPE_SRAM, PI_DOMAIN2, 5, 0xD, 2, 0xC, 0);
|
||||||
|
Loading…
Reference in New Issue
Block a user