1
Fork 0
mirror of https://github.com/redstrate/Novus.git synced 2025-04-19 17:06:50 +00:00

Update to latest libphysis

This commit is contained in:
Joshua Goins 2025-03-23 19:55:28 -04:00
parent 0e1fcebd63
commit b6c2f2eb73
8 changed files with 57 additions and 44 deletions

View file

@ -42,6 +42,7 @@ private:
void exdFinished(int index);
void finished();
physis_EXH *exh;
QFutureWatcher<physis_EXD> *exdFuture;
std::vector<GearInfo> gears;

View file

@ -43,7 +43,8 @@ FullModelViewer::FullModelViewer(GameData *data, FileCache &cache, QWidget *pare
auto buffer = physis_read_file(fileName.toStdString().c_str());
auto charDat = physis_chardat_parse(buffer);
// TODO: Add back
/*auto charDat = physis_chardat_parse(buffer);
gearView->setRace(charDat.race);
gearView->setGender(charDat.gender);
@ -51,7 +52,7 @@ FullModelViewer::FullModelViewer(GameData *data, FileCache &cache, QWidget *pare
gearView->setFace(charDat.head);
gearView->setHair(charDat.hair);
updateBustScaling((float)charDat.bust / 100.0f);
updateHeightScaling((float)charDat.height / 100.0f);
updateHeightScaling((float)charDat.height / 100.0f);*/
});
cmp = physis_cmp_parse(physis_gamedata_extract_file(data, "chara/xls/charamake/human.cmp"));

View file

@ -29,7 +29,7 @@ GearListModel::GearListModel(GameData *data, QObject *parent)
gears.push_back(info);
}
auto exh = physis_parse_excel_sheet_header(physis_gamedata_extract_file(data, "exd/item.exh"));
exh = physis_parse_excel_sheet_header(physis_gamedata_extract_file(data, "exd/item.exh"));
exdFuture = new QFutureWatcher<physis_EXD>(this);
connect(exdFuture, &QFutureWatcher<physis_EXD>::resultReadyAt, this, &GearListModel::exdFinished);
@ -40,7 +40,7 @@ GearListModel::GearListModel(GameData *data, QObject *parent)
pages.push_back(i);
}
std::function<physis_EXD(int)> loadEXD = [data, exh](const int page) -> physis_EXD {
std::function<physis_EXD(int)> loadEXD = [this, data](const int page) -> physis_EXD {
return physis_gamedata_read_excel_sheet(data, "Item", exh, Language::English, page);
};
@ -174,18 +174,19 @@ void GearListModel::exdFinished(int index)
{
auto exd = exdFuture->resultAt(index);
for (unsigned int i = 0; i < exd.row_count; i++) {
const auto row = exd.row_data[i];
auto primaryModel = row.column_data[47].u_int64._0;
for (unsigned int i = 0; i < exh->row_count; i++) {
const auto row = physis_exd_read_row(&exd, exh, i); // TODO: use all rows, free
auto primaryModel = row.row_data[0].column_data[47].u_int64._0;
// auto secondaryModel = row.column_data[48].u_int64._0;
int16_t parts[4];
memcpy(parts, &primaryModel, sizeof(int16_t) * 4);
GearInfo info = {};
info.name = row.column_data[9].string._0;
info.icon = row.column_data[10].u_int16._0;
info.slot = physis_slot_from_id(row.column_data[17].u_int8._0);
info.name = row.row_data[0].column_data[9].string._0;
info.icon = row.row_data[0].column_data[10].u_int16._0;
info.slot = physis_slot_from_id(row.row_data[0].column_data[17].u_int8._0);
info.modelInfo.primaryID = parts[0];
gears.push_back(info);

View file

@ -43,21 +43,28 @@ MapListWidget::MapListWidget(GameData *data, QWidget *parent)
auto nameExd = physis_gamedata_read_excel_sheet(data, "PlaceName", nameExh, Language::English, 0);
auto territoryExd = physis_gamedata_read_excel_sheet(data, "TerritoryType", territoryExh, Language::None, 0);
for (uint32_t i = 0; i < exd.row_count; i++) {
const char *id = exd.row_data[i].column_data[6].string._0;
for (uint32_t i = 0; i < exh->row_count; i++) {
auto rows = physis_exd_read_row(&exd, exh, i); // TODO: free, use all rows
const uint16_t territoryTypeKey = exd.row_data[i].column_data[15].u_int16._0;
if (territoryTypeKey > 0 && territoryTypeKey < territoryExd.row_count) {
const char *bg = territoryExd.row_data[territoryTypeKey].column_data[1].string._0;
const char *id = rows.row_data[0].column_data[6].string._0;
int placeRegionKey = territoryExd.row_data[territoryTypeKey].column_data[3].u_int16._0;
const char *placeRegion = nameExd.row_data[placeRegionKey].column_data[0].string._0;
const uint16_t territoryTypeKey = rows.row_data[0].column_data[15].u_int16._0;
if (territoryTypeKey > 0 && territoryTypeKey < territoryExh->row_count) {
auto territoryExdRow = physis_exd_read_row(&territoryExd, territoryExh, territoryTypeKey); // TODO: free, use all rows
int placeZoneKey = territoryExd.row_data[territoryTypeKey].column_data[4].u_int16._0;
const char *placeZone = nameExd.row_data[placeZoneKey].column_data[0].string._0;
const char *bg = territoryExdRow.row_data[0].column_data[1].string._0;
int placeNameKey = territoryExd.row_data[territoryTypeKey].column_data[5].u_int16._0;
const char *placeName = nameExd.row_data[placeNameKey].column_data[0].string._0;
int placeRegionKey = territoryExdRow.row_data[0].column_data[3].u_int16._0;
auto regionExdRow = physis_exd_read_row(&nameExd, nameExh, placeRegionKey); // TODO: free, use all rows
const char *placeRegion = regionExdRow.row_data[0].column_data[0].string._0;
int placeZoneKey = territoryExdRow.row_data[0].column_data[4].u_int16._0;
auto zoneExdRow = physis_exd_read_row(&nameExd, nameExh, placeRegionKey); // TODO: free, use all rows
const char *placeZone = zoneExdRow.row_data[0].column_data[0].string._0;
int placeNameKey = territoryExdRow.row_data[0].column_data[5].u_int16._0;
auto nameExdRow = physis_exd_read_row(&nameExd, nameExh, placeRegionKey); // TODO: free, use all rows
const char *placeName = nameExdRow.row_data[0].column_data[0].string._0;
QStandardItem *item = new QStandardItem();
item->setData(QString::fromStdString(bg));

View file

@ -109,8 +109,9 @@ void MainWindow::refreshParts(const QString &path)
QFileInfo info(path);
std::string filenameStd = info.fileName().toStdString();
auto crcHash = physis_calculate_hash(filenameStd.c_str());
m_hashLabel->setText(i18n("Hash: 0x%1", QString::number(crcHash, 16).toUpper().rightJustified(8, QLatin1Char('0'))));
// FIXME: add back once hashes are f igured out
// auto crcHash = physis_calculate_hash(filenameStd.c_str());
// m_hashLabel->setText(i18n("Hash: 0x%1", QString::number(crcHash, 16).toUpper().rightJustified(8, QLatin1Char('0'))));
// FIXME: this is terrible, we should not be recalculating this. it isn't a huge deal with the file + index caching, but still
auto datOffset = physis_gamedata_find_offset(data, pathStd.c_str());

View file

@ -6,7 +6,7 @@ add_compile_options(-w)
find_package(Corrosion REQUIRED)
corrosion_import_crate(MANIFEST_PATH ${CMAKE_CURRENT_SOURCE_DIR}/libphysis/Cargo.toml)
corrosion_import_crate(MANIFEST_PATH ${CMAKE_CURRENT_SOURCE_DIR}/libphysis/Cargo.toml FEATURES logging)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/libphysis/logger)
target_include_directories(physis INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/libphysis/target/public)

2
extern/libphysis vendored

@ -1 +1 @@
Subproject commit e4251ed59f7d7d4c0ad5f028044d27486f45844f
Subproject commit 464fe20833554e80cfb052b40393245faac6e5cb

View file

@ -88,44 +88,44 @@ void EXDPart::loadSheet(const QString &name, physis_Buffer buffer, const QString
auto exd = physis_gamedata_read_excel_sheet(data, name.toStdString().c_str(), exh, getSuitableLanguage(exh), i);
tableWidget->setRowCount(exd.row_count);
tableWidget->setRowCount(exh->row_count);
for (unsigned int z = 0; z < exd.column_count; z++) {
auto columnData = exd.row_data[0].column_data[z];
auto columnData = exh->column_types[z];
QString columnType;
switch (columnData.tag) {
case physis_ColumnData::Tag::String:
switch (columnData) {
case ColumnDataType::String:
columnType = i18n("String");
break;
case physis_ColumnData::Tag::Bool:
case ColumnDataType::Bool:
columnType = i18n("Bool");
break;
case physis_ColumnData::Tag::Int8:
case ColumnDataType::Int8:
columnType = i18n("Int8");
break;
case physis_ColumnData::Tag::UInt8:
case ColumnDataType::UInt8:
columnType = i18n("UInt8");
break;
case physis_ColumnData::Tag::Int16:
case ColumnDataType::Int16:
columnType = i18n("Int16");
break;
case physis_ColumnData::Tag::UInt16:
case ColumnDataType::UInt16:
columnType = i18n("UInt16");
break;
case physis_ColumnData::Tag::Int32:
case ColumnDataType::Int32:
columnType = i18n("Int32");
break;
case physis_ColumnData::Tag::UInt32:
case ColumnDataType::UInt32:
columnType = i18n("UInt32");
break;
case physis_ColumnData::Tag::Float32:
case ColumnDataType::Float32:
columnType = i18n("Float32");
break;
case physis_ColumnData::Tag::Int64:
case ColumnDataType::Int64:
columnType = i18n("Int64");
break;
case physis_ColumnData::Tag::UInt64:
case ColumnDataType::UInt64:
columnType = i18n("UInt64");
break;
}
@ -141,9 +141,11 @@ void EXDPart::loadSheet(const QString &name, physis_Buffer buffer, const QString
tableWidget->setHorizontalHeaderItem(z, headerItem);
}
for (unsigned int j = 0; j < exd.row_count; j++) {
for (unsigned int j = 0; j < exh->row_count; j++) {
auto rows = physis_exd_read_row(&exd, exh, j); // TODO: free, use other rows
for (unsigned int z = 0; z < exd.column_count; z++) {
auto columnData = exd.row_data[j].column_data[z];
auto columnData = rows.row_data[0].column_data[z];
auto [columnString, columnRow] = getColumnData(columnData);
@ -155,9 +157,9 @@ void EXDPart::loadSheet(const QString &name, physis_Buffer buffer, const QString
if (cachedExcelSheets.contains(linkName)) {
auto cachedExcel = cachedExcelSheets[linkName];
if (static_cast<unsigned int>(columnRow) < cachedExcel.exd.row_count) {
auto [colString, _] = getColumnData(*cachedExcel.exd.row_data[columnRow].column_data);
columnString = colString;
if (static_cast<unsigned int>(columnRow) < cachedExcel.exh->row_count) {
// auto [colString, _] = getColumnData(*cachedExcel.exh->row_data[columnRow].column_data);
// columnString = colString;
}
}
}