mirror of
https://github.com/InoriRus/Kyty.git
synced 2026-08-28 05:06:40 +00:00
load param.sfo
This commit is contained in:
@@ -102,8 +102,9 @@ public:
|
||||
|
||||
Configuration() = default;
|
||||
|
||||
QString Name;
|
||||
QString BaseDir; /* Game base directory */
|
||||
QString name;
|
||||
QString basedir; /* Game base directory */
|
||||
QString param_file; /* Path to param.sfo */
|
||||
|
||||
Resolution screen_resolution = Resolution::R1280X720;
|
||||
bool neo = true;
|
||||
@@ -118,7 +119,6 @@ public:
|
||||
QString printf_output_file = "_kyty.txt";
|
||||
ProfilerDirection profiler_direction = ProfilerDirection::None;
|
||||
QString profiler_output_file = "_profile.prof";
|
||||
bool spirv_debug_printf_enabled = false;
|
||||
|
||||
QStringList elfs;
|
||||
QStringList elfs_selected;
|
||||
@@ -127,8 +127,9 @@ public:
|
||||
|
||||
void WriteSettings(QSettings* s) const
|
||||
{
|
||||
KYTY_CFG_SET(Name);
|
||||
KYTY_CFG_SET(BaseDir);
|
||||
KYTY_CFG_SET(name);
|
||||
KYTY_CFG_SET(basedir);
|
||||
KYTY_CFG_SET(param_file);
|
||||
KYTY_CFG_SET(screen_resolution);
|
||||
KYTY_CFG_SET(neo);
|
||||
KYTY_CFG_SET(vulkan_validation_enabled);
|
||||
@@ -142,7 +143,6 @@ public:
|
||||
KYTY_CFG_SET(printf_output_file);
|
||||
KYTY_CFG_SET(profiler_direction);
|
||||
KYTY_CFG_SET(profiler_output_file);
|
||||
KYTY_CFG_SET(spirv_debug_printf_enabled);
|
||||
KYTY_CFG_SETL(elfs);
|
||||
KYTY_CFG_SETL(elfs_selected);
|
||||
KYTY_CFG_SETL(libs);
|
||||
@@ -151,8 +151,9 @@ public:
|
||||
|
||||
void ReadSettings(QSettings* s)
|
||||
{
|
||||
KYTY_CFG_GET(Name);
|
||||
KYTY_CFG_GET(BaseDir);
|
||||
KYTY_CFG_GET(name);
|
||||
KYTY_CFG_GET(basedir);
|
||||
KYTY_CFG_GET(param_file);
|
||||
KYTY_CFG_GET(screen_resolution);
|
||||
KYTY_CFG_GET(neo);
|
||||
KYTY_CFG_GET(vulkan_validation_enabled);
|
||||
@@ -166,7 +167,6 @@ public:
|
||||
KYTY_CFG_GET(printf_output_file);
|
||||
KYTY_CFG_GET(profiler_direction);
|
||||
KYTY_CFG_GET(profiler_output_file);
|
||||
KYTY_CFG_GET(spirv_debug_printf_enabled);
|
||||
KYTY_CFG_GETL(elfs);
|
||||
KYTY_CFG_GETL(elfs_selected);
|
||||
KYTY_CFG_GETL(libs);
|
||||
|
||||
@@ -53,8 +53,10 @@ protected:
|
||||
void adjust_size();
|
||||
void save();
|
||||
void browse_base_path();
|
||||
void browse_param_file();
|
||||
void scan_elfs();
|
||||
void scan_libs();
|
||||
void load_param_sfo();
|
||||
void clear();
|
||||
void test();
|
||||
};
|
||||
|
||||
@@ -0,0 +1,118 @@
|
||||
#ifndef LAUNCHER_INCLUDE_PSF_H_
|
||||
#define LAUNCHER_INCLUDE_PSF_H_
|
||||
|
||||
#include "Common.h"
|
||||
|
||||
#include <QFile>
|
||||
#include <QString>
|
||||
|
||||
class Psf
|
||||
{
|
||||
public:
|
||||
Psf() = default;
|
||||
virtual ~Psf() = default;
|
||||
|
||||
KYTY_QT_CLASS_NO_COPY(Psf);
|
||||
|
||||
void Load(const QString& file_name);
|
||||
|
||||
[[nodiscard]] const QMap<QString, QVariant>& GetMap() const { return m_map; }
|
||||
|
||||
private:
|
||||
QMap<QString, QVariant> m_map;
|
||||
};
|
||||
|
||||
inline void Psf::Load(const QString& file_name)
|
||||
{
|
||||
struct ParamInfo
|
||||
{
|
||||
uint16_t name_offset;
|
||||
uint16_t type;
|
||||
uint32_t size1;
|
||||
uint32_t size2;
|
||||
uint32_t value_offset;
|
||||
};
|
||||
|
||||
QFile f(file_name);
|
||||
if (!f.open(QIODevice::ReadOnly))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
QDataStream s(&f);
|
||||
|
||||
s.setByteOrder(QDataStream::LittleEndian);
|
||||
|
||||
uint32_t magic1 = 0;
|
||||
uint32_t magic2 = 0;
|
||||
|
||||
s >> magic1;
|
||||
s >> magic2;
|
||||
|
||||
if (magic1 != 0x46535000 && magic2 != 0x00000101)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
uint32_t name_tbl_offset = 0;
|
||||
uint32_t value_tbl_offset = 0;
|
||||
uint32_t params_num = 0;
|
||||
|
||||
s >> name_tbl_offset;
|
||||
s >> value_tbl_offset;
|
||||
s >> params_num;
|
||||
|
||||
if (name_tbl_offset == 0 || value_tbl_offset == 0 || value_tbl_offset <= name_tbl_offset || params_num == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
uint32_t name_tbl_size = value_tbl_offset - name_tbl_offset;
|
||||
|
||||
auto* params = new ParamInfo[params_num];
|
||||
auto* name_tbl = new char[name_tbl_size];
|
||||
|
||||
for (uint32_t i = 0; i < params_num; i++)
|
||||
{
|
||||
s >> params[i].name_offset;
|
||||
s >> params[i].type;
|
||||
s >> params[i].size1;
|
||||
s >> params[i].size2;
|
||||
s >> params[i].value_offset;
|
||||
}
|
||||
|
||||
s.device()->seek(name_tbl_offset);
|
||||
s.readRawData(name_tbl, static_cast<int>(name_tbl_size));
|
||||
|
||||
for (uint32_t i = 0; i < params_num; i++)
|
||||
{
|
||||
QString name = name_tbl + params[i].name_offset;
|
||||
|
||||
switch (params[i].type)
|
||||
{
|
||||
case 0x0204:
|
||||
{
|
||||
s.device()->seek(value_tbl_offset + params[i].value_offset);
|
||||
QByteArray buf(static_cast<int>(params[i].size1), Qt::Uninitialized);
|
||||
s.readRawData(buf.data(), static_cast<int>(params[i].size1));
|
||||
QString value(buf);
|
||||
m_map.insert(name, value);
|
||||
break;
|
||||
}
|
||||
case 0x0404:
|
||||
{
|
||||
uint32_t value = 0;
|
||||
s.device()->seek(value_tbl_offset + params[i].value_offset);
|
||||
s >> value;
|
||||
m_map.insert(name, value);
|
||||
break;
|
||||
}
|
||||
default:;
|
||||
}
|
||||
}
|
||||
|
||||
delete[] params;
|
||||
delete[] name_tbl;
|
||||
}
|
||||
|
||||
#endif /* LAUNCHER_INCLUDE_PSF_H_ */
|
||||
Reference in New Issue
Block a user