mirror of
https://github.com/redstrate/Novus.git
synced 2025-04-24 13:07:44 +00:00
Rename directories, update README
This commit is contained in:
parent
d8a4178095
commit
0f2eaab936
21 changed files with 74 additions and 54 deletions
|
@ -51,15 +51,15 @@ if(APPLE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_subdirectory(renderer)
|
add_subdirectory(renderer)
|
||||||
add_subdirectory(exdviewer)
|
add_subdirectory(karuku)
|
||||||
add_subdirectory(armoury)
|
add_subdirectory(armoury)
|
||||||
add_subdirectory(argcracker)
|
add_subdirectory(argcracker)
|
||||||
add_subdirectory(explorer)
|
add_subdirectory(sagasu)
|
||||||
#add_subdirectory(bonedecomp) # not yet ported to physis
|
#add_subdirectory(bonedecomp) # not yet ported to physis
|
||||||
add_subdirectory(parts)
|
add_subdirectory(parts)
|
||||||
add_subdirectory(common)
|
add_subdirectory(common)
|
||||||
add_subdirectory(mdlviewer)
|
add_subdirectory(mdlviewer)
|
||||||
add_subdirectory(sdklauncher)
|
add_subdirectory(launcher)
|
||||||
|
|
||||||
feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES)
|
feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES)
|
||||||
|
|
||||||
|
|
11
README.md
11
README.md
|
@ -11,12 +11,11 @@ any stable releases.
|
||||||
|
|
||||||
This repository contains many parts of Novus, such as:
|
This repository contains many parts of Novus, such as:
|
||||||
|
|
||||||
* [Argcracker](argcracker), a program that can decrypt game arguments.
|
* [Argcracker](argcracker), a program that can help decrypt game arguments.
|
||||||
* [Armoury](armoury), a graphical gear and character viewer.
|
* [Armoury](armoury), a graphical gear and character viewer. It also supports GLTF export.
|
||||||
* [Bone Decompiler](bonedecomp), a tool to decompile Havok skeleton files into TexTools-compatible JSON.
|
* [Karuku](karuku), a graphical program to view Excel data sheets.
|
||||||
* [EXD Viewer](exdviewer), a graphical program to view Excel (EXD) sheets from the game.
|
* [MDLViewer](mdlviewer), a graphical model viewer for MDL files.
|
||||||
* [Explorer](explorer), a graphical interface to explore DAT files.
|
* [Sagasu](sagasu), a graphical interface to explore FFXIV data archive files.
|
||||||
* [Model Viewer](mdlviewer), a graphical model viewer for MDL files.
|
|
||||||
|
|
||||||
## Building
|
## Building
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,11 @@
|
||||||
|
|
||||||
struct GameData;
|
struct GameData;
|
||||||
|
|
||||||
class MainWindow : public QMainWindow {
|
class MainWindow : public QMainWindow
|
||||||
|
{
|
||||||
public:
|
public:
|
||||||
MainWindow(GameData* data);
|
MainWindow(GameData *data);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
GameData* data = nullptr;
|
GameData *data = nullptr;
|
||||||
};
|
};
|
|
@ -8,7 +8,8 @@
|
||||||
#include "mainwindow.h"
|
#include "mainwindow.h"
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
|
|
||||||
int main(int argc, char* argv[]) {
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
QApplication app(argc, argv);
|
QApplication app(argc, argv);
|
||||||
|
|
||||||
customizeAboutData(QStringLiteral("karuku"), QStringLiteral("Karuku"), QStringLiteral("Program to view FFXIV Excel files."));
|
customizeAboutData(QStringLiteral("karuku"), QStringLiteral("Karuku"), QStringLiteral("Program to view FFXIV Excel files."));
|
|
@ -17,7 +17,9 @@
|
||||||
|
|
||||||
#include "exdpart.h"
|
#include "exdpart.h"
|
||||||
|
|
||||||
MainWindow::MainWindow(GameData* data) : data(data) {
|
MainWindow::MainWindow(GameData *data)
|
||||||
|
: data(data)
|
||||||
|
{
|
||||||
setWindowTitle(QStringLiteral("Karuku"));
|
setWindowTitle(QStringLiteral("Karuku"));
|
||||||
setMinimumSize(1280, 720);
|
setMinimumSize(1280, 720);
|
||||||
|
|
||||||
|
@ -68,7 +70,7 @@ MainWindow::MainWindow(GameData* data) : data(data) {
|
||||||
auto exdPart = new EXDPart(data);
|
auto exdPart = new EXDPart(data);
|
||||||
layout->addWidget(exdPart);
|
layout->addWidget(exdPart);
|
||||||
|
|
||||||
connect(listWidget, &QListWidget::itemClicked, this, [exdPart](QListWidgetItem* item) {
|
connect(listWidget, &QListWidget::itemClicked, this, [exdPart](QListWidgetItem *item) {
|
||||||
auto name = item->text().toStdString();
|
auto name = item->text().toStdString();
|
||||||
auto nameLowercase = item->text().toLower().toStdString();
|
auto nameLowercase = item->text().toLower().toStdString();
|
||||||
|
|
|
@ -5,7 +5,8 @@
|
||||||
|
|
||||||
#include <QMainWindow>
|
#include <QMainWindow>
|
||||||
|
|
||||||
class MainWindow : public QMainWindow {
|
class MainWindow : public QMainWindow
|
||||||
|
{
|
||||||
public:
|
public:
|
||||||
MainWindow();
|
MainWindow();
|
||||||
};
|
};
|
|
@ -10,7 +10,8 @@
|
||||||
|
|
||||||
#include "mainwindow.h"
|
#include "mainwindow.h"
|
||||||
|
|
||||||
int main(int argc, char* argv[]) {
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
QApplication app(argc, argv);
|
QApplication app(argc, argv);
|
||||||
|
|
||||||
KConfig config(QStringLiteral("novusrc"));
|
KConfig config(QStringLiteral("novusrc"));
|
|
@ -17,7 +17,8 @@ static QMap<QString, QString> applications = {{QStringLiteral("Armoury - View an
|
||||||
{QStringLiteral("Sagasu - Explore data archives"), QStringLiteral("novus-sagasu")},
|
{QStringLiteral("Sagasu - Explore data archives"), QStringLiteral("novus-sagasu")},
|
||||||
{QStringLiteral("Model Viewer - Preview MDL files"), QStringLiteral("novus-mdlviewer")}};
|
{QStringLiteral("Model Viewer - Preview MDL files"), QStringLiteral("novus-mdlviewer")}};
|
||||||
|
|
||||||
MainWindow::MainWindow() {
|
MainWindow::MainWindow()
|
||||||
|
{
|
||||||
setWindowTitle(QStringLiteral("Novus SDK"));
|
setWindowTitle(QStringLiteral("Novus SDK"));
|
||||||
|
|
||||||
auto appList = new QListWidget();
|
auto appList = new QListWidget();
|
||||||
|
@ -28,7 +29,7 @@ MainWindow::MainWindow() {
|
||||||
|
|
||||||
appList->addItem(applicationHeader);
|
appList->addItem(applicationHeader);
|
||||||
|
|
||||||
for(const auto& name : applications.keys()) {
|
for (const auto &name : applications.keys()) {
|
||||||
appList->addItem(name);
|
appList->addItem(name);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,11 +6,12 @@
|
||||||
#include <QMdiSubWindow>
|
#include <QMdiSubWindow>
|
||||||
#include <physis.hpp>
|
#include <physis.hpp>
|
||||||
|
|
||||||
class FilePropertiesWindow : public QWidget {
|
class FilePropertiesWindow : public QWidget
|
||||||
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit FilePropertiesWindow(GameData* data, QString path, QWidget* parent = nullptr);
|
explicit FilePropertiesWindow(GameData *data, QString path, QWidget *parent = nullptr);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
GameData* data = nullptr;
|
GameData *data = nullptr;
|
||||||
};
|
};
|
|
@ -11,24 +11,25 @@ struct PathPart {
|
||||||
QMap<QString, PathPart> children;
|
QMap<QString, PathPart> children;
|
||||||
};
|
};
|
||||||
|
|
||||||
class FileTreeWindow : public QWidget {
|
class FileTreeWindow : public QWidget
|
||||||
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit FileTreeWindow(GameData* data, QWidget *parent = nullptr);
|
explicit FileTreeWindow(GameData *data, QWidget *parent = nullptr);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
GameData* data = nullptr;
|
GameData *data = nullptr;
|
||||||
|
|
||||||
void addPath(QString path);
|
void addPath(QString path);
|
||||||
void addUnknownPath(QString knownDirectory, uint32_t crcHash);
|
void addUnknownPath(QString knownDirectory, uint32_t crcHash);
|
||||||
void traversePart(QList<QString> tokens, PathPart& part, QString pathSoFar);
|
void traversePart(QList<QString> tokens, PathPart &part, QString pathSoFar);
|
||||||
std::tuple<bool, QString> traverseUnknownPath(uint32_t crcHash, PathPart& part, QString pathSoFar);
|
std::tuple<bool, QString> traverseUnknownPath(uint32_t crcHash, PathPart &part, QString pathSoFar);
|
||||||
|
|
||||||
QMap<QString, PathPart> rootParts;
|
QMap<QString, PathPart> rootParts;
|
||||||
|
|
||||||
void addPaths(QTreeWidget *pWidget);
|
void addPaths(QTreeWidget *pWidget);
|
||||||
|
|
||||||
QTreeWidgetItem* addPartAndChildren(const QString& qString, const PathPart& part, const QString& pathSoFar);
|
QTreeWidgetItem *addPartAndChildren(const QString &qString, const PathPart &part, const QString &pathSoFar);
|
||||||
|
|
||||||
Q_SIGNALS:
|
Q_SIGNALS:
|
||||||
void openFileProperties(QString path);
|
void openFileProperties(QString path);
|
|
@ -10,14 +10,13 @@
|
||||||
|
|
||||||
struct GameData;
|
struct GameData;
|
||||||
|
|
||||||
class MainWindow : public QMainWindow {
|
class MainWindow : public QMainWindow
|
||||||
|
{
|
||||||
public:
|
public:
|
||||||
MainWindow(GameData* data);
|
MainWindow(GameData *data);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
QMdiArea *mdiArea = nullptr;
|
||||||
|
|
||||||
QMdiArea* mdiArea = nullptr;
|
GameData *data;
|
||||||
|
|
||||||
|
|
||||||
GameData* data;
|
|
||||||
};
|
};
|
|
@ -9,8 +9,10 @@
|
||||||
|
|
||||||
#include "filepropertieswindow.h"
|
#include "filepropertieswindow.h"
|
||||||
|
|
||||||
FilePropertiesWindow::FilePropertiesWindow(GameData* data, QString path, QWidget* parent)
|
FilePropertiesWindow::FilePropertiesWindow(GameData *data, QString path, QWidget *parent)
|
||||||
: QWidget(parent), data(data) {
|
: QWidget(parent)
|
||||||
|
, data(data)
|
||||||
|
{
|
||||||
setWindowTitle(QStringLiteral("Properties for ") + path);
|
setWindowTitle(QStringLiteral("Properties for ") + path);
|
||||||
|
|
||||||
auto layout = new QFormLayout();
|
auto layout = new QFormLayout();
|
|
@ -8,7 +8,10 @@
|
||||||
|
|
||||||
#include "filetreewindow.h"
|
#include "filetreewindow.h"
|
||||||
|
|
||||||
FileTreeWindow::FileTreeWindow(GameData* data, QWidget* parent) : QWidget(parent), data(data) {
|
FileTreeWindow::FileTreeWindow(GameData *data, QWidget *parent)
|
||||||
|
: QWidget(parent)
|
||||||
|
, data(data)
|
||||||
|
{
|
||||||
setWindowTitle(QStringLiteral("File Tree"));
|
setWindowTitle(QStringLiteral("File Tree"));
|
||||||
|
|
||||||
auto layout = new QHBoxLayout();
|
auto layout = new QHBoxLayout();
|
||||||
|
@ -41,7 +44,7 @@ FileTreeWindow::FileTreeWindow(GameData* data, QWidget* parent) : QWidget(parent
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
|
treeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||||
connect(treeWidget, &QTreeWidget::customContextMenuRequested, this, [this, treeWidget](const QPoint& pos) {
|
connect(treeWidget, &QTreeWidget::customContextMenuRequested, this, [this, treeWidget](const QPoint &pos) {
|
||||||
auto *item = treeWidget->itemAt(pos);
|
auto *item = treeWidget->itemAt(pos);
|
||||||
|
|
||||||
if (item != nullptr) {
|
if (item != nullptr) {
|
||||||
|
@ -63,7 +66,8 @@ FileTreeWindow::FileTreeWindow(GameData* data, QWidget* parent) : QWidget(parent
|
||||||
addPaths(treeWidget);
|
addPaths(treeWidget);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileTreeWindow::addPath(QString path) {
|
void FileTreeWindow::addPath(QString path)
|
||||||
|
{
|
||||||
auto tokens = path.split(QStringLiteral("/"));
|
auto tokens = path.split(QStringLiteral("/"));
|
||||||
auto nextToken = tokens[0];
|
auto nextToken = tokens[0];
|
||||||
tokens.pop_front();
|
tokens.pop_front();
|
||||||
|
@ -71,8 +75,9 @@ void FileTreeWindow::addPath(QString path) {
|
||||||
traversePart(tokens, rootParts[nextToken], nextToken);
|
traversePart(tokens, rootParts[nextToken], nextToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileTreeWindow::traversePart(QList<QString> tokens, PathPart& part, QString pathSoFar) {
|
void FileTreeWindow::traversePart(QList<QString> tokens, PathPart &part, QString pathSoFar)
|
||||||
if(tokens.empty())
|
{
|
||||||
|
if (tokens.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
auto nextToken = tokens[0];
|
auto nextToken = tokens[0];
|
||||||
|
@ -84,21 +89,23 @@ void FileTreeWindow::traversePart(QList<QString> tokens, PathPart& part, QString
|
||||||
traversePart(tokens, part.children[nextToken], pathSoFar);
|
traversePart(tokens, part.children[nextToken], pathSoFar);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileTreeWindow::addPaths(QTreeWidget *pWidget) {
|
void FileTreeWindow::addPaths(QTreeWidget *pWidget)
|
||||||
for(const auto& name : rootParts.keys()) {
|
{
|
||||||
|
for (const auto &name : rootParts.keys()) {
|
||||||
auto item = addPartAndChildren(name, rootParts.value(name), QStringLiteral(""));
|
auto item = addPartAndChildren(name, rootParts.value(name), QStringLiteral(""));
|
||||||
pWidget->addTopLevelItem(item);
|
pWidget->addTopLevelItem(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QTreeWidgetItem* FileTreeWindow::addPartAndChildren(const QString& qString, const PathPart& part, const QString& pathSoFar) {
|
QTreeWidgetItem *FileTreeWindow::addPartAndChildren(const QString &qString, const PathPart &part, const QString &pathSoFar)
|
||||||
|
{
|
||||||
QString newPath = pathSoFar.isEmpty() ? qString : pathSoFar + QStringLiteral("/") + qString;
|
QString newPath = pathSoFar.isEmpty() ? qString : pathSoFar + QStringLiteral("/") + qString;
|
||||||
|
|
||||||
auto item = new QTreeWidgetItem();
|
auto item = new QTreeWidgetItem();
|
||||||
item->setData(0, Qt::UserRole, newPath);
|
item->setData(0, Qt::UserRole, newPath);
|
||||||
item->setText(0, qString);
|
item->setText(0, qString);
|
||||||
|
|
||||||
for(const auto& name : part.children.keys()) {
|
for (const auto &name : part.children.keys()) {
|
||||||
auto childItem = addPartAndChildren(name, part.children.value(name), newPath);
|
auto childItem = addPartAndChildren(name, part.children.value(name), newPath);
|
||||||
item->addChild(childItem);
|
item->addChild(childItem);
|
||||||
}
|
}
|
||||||
|
@ -106,27 +113,29 @@ QTreeWidgetItem* FileTreeWindow::addPartAndChildren(const QString& qString, cons
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileTreeWindow::addUnknownPath(QString knownDirectory, uint32_t crcHash) {
|
void FileTreeWindow::addUnknownPath(QString knownDirectory, uint32_t crcHash)
|
||||||
|
{
|
||||||
auto [found, path] = traverseUnknownPath(crcHash, rootParts[knownDirectory], knownDirectory);
|
auto [found, path] = traverseUnknownPath(crcHash, rootParts[knownDirectory], knownDirectory);
|
||||||
if(found)
|
if (found)
|
||||||
addPath(path);
|
addPath(path);
|
||||||
else
|
else
|
||||||
addPath(knownDirectory + QStringLiteral("/Unknown File Hash ") + QString::number(crcHash));
|
addPath(knownDirectory + QStringLiteral("/Unknown File Hash ") + QString::number(crcHash));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::tuple<bool, QString> FileTreeWindow::traverseUnknownPath(uint32_t crcHash, PathPart &part, QString pathSoFar) {
|
std::tuple<bool, QString> FileTreeWindow::traverseUnknownPath(uint32_t crcHash, PathPart &part, QString pathSoFar)
|
||||||
if(part.crcHash == crcHash)
|
{
|
||||||
|
if (part.crcHash == crcHash)
|
||||||
return {true, pathSoFar};
|
return {true, pathSoFar};
|
||||||
|
|
||||||
bool found = false;
|
bool found = false;
|
||||||
QString childPath = pathSoFar;
|
QString childPath = pathSoFar;
|
||||||
for(auto path : part.children.keys()) {
|
for (auto path : part.children.keys()) {
|
||||||
if (path.contains(QStringLiteral("Unknown")))
|
if (path.contains(QStringLiteral("Unknown")))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
auto [childFound, newPath] = traverseUnknownPath(crcHash, part.children[path], pathSoFar + QStringLiteral("/") + path);
|
auto [childFound, newPath] = traverseUnknownPath(crcHash, part.children[path], pathSoFar + QStringLiteral("/") + path);
|
||||||
found |= childFound;
|
found |= childFound;
|
||||||
if(childFound)
|
if (childFound)
|
||||||
childPath = newPath;
|
childPath = newPath;
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,8 @@
|
||||||
#include "mainwindow.h"
|
#include "mainwindow.h"
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
|
|
||||||
int main(int argc, char* argv[]) {
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
QApplication app(argc, argv);
|
QApplication app(argc, argv);
|
||||||
|
|
||||||
customizeAboutData(QStringLiteral("sagasu"), QStringLiteral("Sagasu"), QStringLiteral("Program to explore FFXIV data archives."));
|
customizeAboutData(QStringLiteral("sagasu"), QStringLiteral("Sagasu"), QStringLiteral("Program to explore FFXIV data archives."));
|
|
@ -18,7 +18,9 @@
|
||||||
#include "filepropertieswindow.h"
|
#include "filepropertieswindow.h"
|
||||||
#include "filetreewindow.h"
|
#include "filetreewindow.h"
|
||||||
|
|
||||||
MainWindow::MainWindow(GameData* data) : data(data) {
|
MainWindow::MainWindow(GameData *data)
|
||||||
|
: data(data)
|
||||||
|
{
|
||||||
setWindowTitle(QStringLiteral("Sagasu"));
|
setWindowTitle(QStringLiteral("Sagasu"));
|
||||||
|
|
||||||
auto fileMenu = menuBar()->addMenu(QStringLiteral("File"));
|
auto fileMenu = menuBar()->addMenu(QStringLiteral("File"));
|
||||||
|
@ -60,4 +62,3 @@ MainWindow::MainWindow(GameData* data) : data(data) {
|
||||||
|
|
||||||
mdiArea->addSubWindow(tree);
|
mdiArea->addSubWindow(tree);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue