Redesigned Debug Globals. (#1696)

This commit is contained in:
gir489
2023-07-13 12:42:21 -04:00
committed by GitHub
parent 05a917bbbb
commit 5770466a84
4 changed files with 233 additions and 323 deletions

View File

@ -1,78 +0,0 @@
#include "globals_service.hpp"
#include "thread_pool.hpp"
namespace big
{
globals_service::globals_service() :
m_globals_file(g_file_manager.get_project_file("./globals.json"))
{ }
globals_service::~globals_service()
{
m_running = false;
save();
}
void globals_service::build()
{
m_globals.clear();
for (auto& global : m_globals)
global.build_cache();
}
bool globals_service::load()
{
m_globals_file;
std::ifstream file(m_globals_file.get_path(), std::ios::binary);
if (!file.is_open())
return false;
try
{
nlohmann::json j;
file >> j;
m_globals = j.get<global_vec>();
build();
}
catch (const std::exception&)
{
LOG(WARNING) << "Failure to parse globals.json, aborting...";
return false;
}
return true;
}
void globals_service::loop()
{
while (m_running)
for (auto& global : m_globals)
if (global.m_freeze)
global.write();
}
void globals_service::save()
{
nlohmann::json j = m_globals;
std::ofstream file(m_globals_file.get_path(), std::ios::binary | std::ios::out | std::ios::trunc);
try
{
file << j.dump(4);
file.close();
}
catch (const std::exception&)
{
LOG(WARNING) << "Failed to write to globals.json";
}
}
}

View File

@ -1,114 +0,0 @@
#pragma once
#include "script_global.hpp"
namespace big
{
struct global_offset
{
int m_offset = 0;
int m_size = 0;
global_offset() = default;
global_offset(int offset, int size = 0)
{
m_offset = offset;
if (size)
m_size = size;
}
script_global apply(script_global internal_cache)
{
return m_size ? internal_cache.at(m_offset, m_size) : internal_cache.at(m_offset);
}
};
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(global_offset, m_offset, m_size)
struct global
{
int m_base_address;
bool m_freeze = false;
std::string m_name;
std::vector<global_offset> m_offsets;
int m_value;
global() = default;
global(const char* name, const int base_address, const bool freeze, const int (*offsets)[2], int offset_count) :
m_name(name),
m_base_address(base_address),
m_freeze(freeze)
{
m_internal_id = ++m_instance_count;
for (int i = 0; i < offset_count; ++i)
{
const auto offset = offsets[i];
m_offsets.push_back({ offset[0], offset[1] });
}
}
void build_cache()
{
script_global internal_cache(m_base_address);
for (auto& offset : m_offsets)
internal_cache = offset.apply(internal_cache);
m_internal_addr = internal_cache.as<int*>();
}
int* get()
{
if (m_freeze)
return &m_value;
return m_internal_addr;
}
int get_id()
{
return m_internal_id;
}
void set(int value)
{
m_value = value;
if (!m_freeze)
this->write();
}
void write()
{
*m_internal_addr = m_value;
}
private:
inline static int m_instance_count;
int m_internal_id;
int* m_internal_addr;
};
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(global, m_base_address, m_freeze, m_offsets, m_name, m_value)
using global_vec = std::vector<global>;
class globals_service
{
file m_globals_file;
public:
globals_service();
~globals_service();
bool load();
void loop();
void save();
global_vec m_globals;
bool m_running = false;
private:
void build();
};
inline auto g_globals_service = globals_service();
}