mirror of https://github.com/AxioDL/metaforce.git
work on extract tool
This commit is contained in:
parent
81d8329f74
commit
45c593b596
|
@ -11,7 +11,14 @@ add_executable(hecl main.cpp
|
||||||
ToolRemove.hpp
|
ToolRemove.hpp
|
||||||
ToolSpec.hpp
|
ToolSpec.hpp
|
||||||
)
|
)
|
||||||
target_link_libraries(hecl HECL HECLDatabase
|
|
||||||
"-Wl,-whole-archive" RetroDataSpec "-Wl,-no-whole-archive"
|
list(APPEND DATA_SPEC_LIBS
|
||||||
AthenaCore NOD LogVisor blowfish z lzo2 pthread
|
RetroDataSpec
|
||||||
|
DNAMP1
|
||||||
|
DNAMP2
|
||||||
|
DNAMP3)
|
||||||
|
|
||||||
|
target_link_libraries(hecl
|
||||||
|
"-Wl,-whole-archive" ${DATA_SPEC_LIBS} "-Wl,-no-whole-archive"
|
||||||
|
HECL HECLDatabase AthenaCore NOD LogVisor blowfish z lzo2 pthread
|
||||||
)
|
)
|
||||||
|
|
|
@ -38,6 +38,9 @@ public:
|
||||||
|
|
||||||
#define RED "\033[0;31m"
|
#define RED "\033[0;31m"
|
||||||
#define GREEN "\033[0;32m"
|
#define GREEN "\033[0;32m"
|
||||||
|
#define YELLOW "\033[0;33m"
|
||||||
|
#define BLUE "\033[0;34m"
|
||||||
|
#define MAGENTA "\033[0;35m"
|
||||||
#define CYAN "\033[0;36m"
|
#define CYAN "\033[0;36m"
|
||||||
#define BOLD "\033[1m"
|
#define BOLD "\033[1m"
|
||||||
#define NORMAL "\033[0m"
|
#define NORMAL "\033[0m"
|
||||||
|
|
|
@ -6,15 +6,32 @@
|
||||||
|
|
||||||
class ToolExtract final : public ToolBase
|
class ToolExtract final : public ToolBase
|
||||||
{
|
{
|
||||||
|
HECL::Database::IDataSpec::ExtractPassInfo m_einfo;
|
||||||
|
std::vector<std::unique_ptr<HECL::Database::IDataSpec>> m_dataSpecs;
|
||||||
|
std::vector<HECL::Database::IDataSpec::ExtractReport> m_reps;
|
||||||
public:
|
public:
|
||||||
ToolExtract(const ToolPassInfo& info)
|
ToolExtract(const ToolPassInfo& info)
|
||||||
: ToolBase(info)
|
: ToolBase(info)
|
||||||
{
|
{
|
||||||
if (!info.project)
|
if (!info.project)
|
||||||
LogModule.report(LogVisor::FatalError, "hecl extract must be ran within a project directory");
|
LogModule.report(LogVisor::FatalError, "hecl extract must be ran within a project directory");
|
||||||
|
if (!m_info.args.size())
|
||||||
|
LogModule.report(LogVisor::FatalError, "hecl extract needs a source path as its first argument");
|
||||||
|
|
||||||
|
m_einfo.srcpath = &m_info.args[0];
|
||||||
|
m_einfo.extractArgs.reserve(info.args.size() - 1);
|
||||||
|
for (std::vector<HECL::SystemString>::const_iterator it=info.args.begin() + 1;
|
||||||
|
it != info.args.end();
|
||||||
|
++it)
|
||||||
|
m_einfo.extractArgs.push_back(&*it);
|
||||||
|
|
||||||
for (const HECL::Database::DataSpecEntry* entry : HECL::Database::DATA_SPEC_REGISTRY)
|
for (const HECL::Database::DataSpecEntry* entry : HECL::Database::DATA_SPEC_REGISTRY)
|
||||||
{
|
{
|
||||||
|
HECL::Database::IDataSpec* ds = entry->m_factory(HECL::Database::TOOL_EXTRACT);
|
||||||
|
if (ds->canExtract(m_einfo, m_reps))
|
||||||
|
m_dataSpecs.emplace_back(ds);
|
||||||
|
else
|
||||||
|
delete ds;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,8 +64,57 @@ public:
|
||||||
|
|
||||||
HECL::SystemString toolName() const {return _S("extract");}
|
HECL::SystemString toolName() const {return _S("extract");}
|
||||||
|
|
||||||
|
static void _recursivePrint(int level, HECL::Database::IDataSpec::ExtractReport& rep)
|
||||||
|
{
|
||||||
|
for (int l=0 ; l<level ; ++l)
|
||||||
|
HECL::Printf(_S(" "));
|
||||||
|
if (XTERM_COLOR)
|
||||||
|
HECL::Printf(_S("" CYAN BOLD "%s" NORMAL "\n"), rep.name.c_str());
|
||||||
|
else
|
||||||
|
HECL::Printf(_S("%s\n"), rep.name.c_str());
|
||||||
|
for (int l=0 ; l<level ; ++l)
|
||||||
|
HECL::Printf(_S(" "));
|
||||||
|
HECL::Printf(_S(" %s\n"), rep.desc.c_str());
|
||||||
|
for (HECL::Database::IDataSpec::ExtractReport& child : rep.childOpts)
|
||||||
|
_recursivePrint(level + 1, child);
|
||||||
|
}
|
||||||
|
|
||||||
int run()
|
int run()
|
||||||
{
|
{
|
||||||
|
if (m_dataSpecs.empty())
|
||||||
|
{
|
||||||
|
if (XTERM_COLOR)
|
||||||
|
HECL::Printf(_S("" RED BOLD "NOTHING TO EXTRACT" NORMAL "\n"));
|
||||||
|
else
|
||||||
|
HECL::Printf(_S("NOTHING TO EXTRACT\n"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (XTERM_COLOR)
|
||||||
|
HECL::Printf(_S("" GREEN BOLD "ABOUT TO EXTRACT:" NORMAL "\n"));
|
||||||
|
else
|
||||||
|
HECL::Printf(_S("ABOUT TO EXTRACT:\n"));
|
||||||
|
|
||||||
|
for (HECL::Database::IDataSpec::ExtractReport& rep : m_reps)
|
||||||
|
_recursivePrint(0, rep);
|
||||||
|
|
||||||
|
if (XTERM_COLOR)
|
||||||
|
HECL::Printf(_S("" BLUE BOLD "Continue?" NORMAL "(Y/N)"));
|
||||||
|
else
|
||||||
|
HECL::Printf(_S("Continue? (Y/N)"));
|
||||||
|
|
||||||
|
int ch;
|
||||||
|
while ((ch = getchar()))
|
||||||
|
{
|
||||||
|
if (ch == 'n' || ch == 'N')
|
||||||
|
return 0;
|
||||||
|
if (ch == 'y' || ch == 'Y')
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (std::unique_ptr<HECL::Database::IDataSpec>& ds : m_dataSpecs)
|
||||||
|
ds->doExtract(*m_info.project, m_einfo);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit fc6b61a63ee30ad3aa6a6cecb3848732b514e54b
|
Subproject commit 043af55580d26a8faab8007c73217c26c19c4cf8
|
|
@ -70,26 +70,24 @@ public:
|
||||||
*/
|
*/
|
||||||
struct ExtractPassInfo
|
struct ExtractPassInfo
|
||||||
{
|
{
|
||||||
SystemString srcpath;
|
const SystemString* srcpath;
|
||||||
ProjectPath subpath;
|
std::vector<const SystemString*> extractArgs;
|
||||||
bool cookedonly;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Interactive Extract Option
|
* @brief Extract Report Representation
|
||||||
*
|
*
|
||||||
* Constructed by canExtract() to solicit the user for game-specific
|
* Constructed by canExtract() to advise the user of the content about
|
||||||
* extraction options (i.e. games that are gathered into a trilogy collection)
|
* to be extracted
|
||||||
*/
|
*/
|
||||||
struct ExtractOption
|
struct ExtractReport
|
||||||
{
|
{
|
||||||
SystemString name;
|
SystemString name;
|
||||||
SystemString desc;
|
SystemString desc;
|
||||||
bool defVal;
|
std::vector<ExtractReport> childOpts;
|
||||||
std::vector<ExtractOption> childOpts;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
virtual bool canExtract(const ExtractPassInfo& info, std::vector<ExtractOption>& opts)
|
virtual bool canExtract(const ExtractPassInfo& info, std::vector<ExtractReport>& reps)
|
||||||
{(void)info;LogModule.report(LogVisor::Error, "not implemented");return false;}
|
{(void)info;LogModule.report(LogVisor::Error, "not implemented");return false;}
|
||||||
virtual void doExtract(const Project& project, const ExtractPassInfo& info)
|
virtual void doExtract(const Project& project, const ExtractPassInfo& info)
|
||||||
{(void)project;(void)info;}
|
{(void)project;(void)info;}
|
||||||
|
|
|
@ -207,20 +207,19 @@ Project::Project(const ProjectRootPath& rootPath)
|
||||||
FILE* bf = HECL::Fopen((m_rootPath.getAbsolutePath() + _S("/.hecl/beacon")).c_str(), _S("a+b"));
|
FILE* bf = HECL::Fopen((m_rootPath.getAbsolutePath() + _S("/.hecl/beacon")).c_str(), _S("a+b"));
|
||||||
struct BeaconStruct
|
struct BeaconStruct
|
||||||
{
|
{
|
||||||
FourCC magic;
|
uint32_t magic;
|
||||||
uint32_t version;
|
uint32_t version;
|
||||||
} beacon;
|
} beacon;
|
||||||
#define DATA_VERSION 1
|
#define DATA_VERSION 1
|
||||||
static const FourCC hecl("HECL");
|
|
||||||
if (fread(&beacon, 1, sizeof(beacon), bf) != sizeof(beacon))
|
if (fread(&beacon, 1, sizeof(beacon), bf) != sizeof(beacon))
|
||||||
{
|
{
|
||||||
fseek(bf, 0, SEEK_SET);
|
fseek(bf, 0, SEEK_SET);
|
||||||
beacon.magic = hecl;
|
beacon.magic = SBig('HECL');
|
||||||
beacon.version = SBig(DATA_VERSION);
|
beacon.version = SBig(DATA_VERSION);
|
||||||
fwrite(&beacon, 1, sizeof(beacon), bf);
|
fwrite(&beacon, 1, sizeof(beacon), bf);
|
||||||
}
|
}
|
||||||
fclose(bf);
|
fclose(bf);
|
||||||
if (beacon.magic != hecl ||
|
if (beacon.magic != SBig('HECL') ||
|
||||||
SBig(beacon.version) != DATA_VERSION)
|
SBig(beacon.version) != DATA_VERSION)
|
||||||
{
|
{
|
||||||
LogModule.report(LogVisor::FatalError, "incompatible project version");
|
LogModule.report(LogVisor::FatalError, "incompatible project version");
|
||||||
|
|
Loading…
Reference in New Issue