diff --git a/apps/armoury/src/gearlistmodel.cpp b/apps/armoury/src/gearlistmodel.cpp index f66b4a3..68d6991 100644 --- a/apps/armoury/src/gearlistmodel.cpp +++ b/apps/armoury/src/gearlistmodel.cpp @@ -33,23 +33,23 @@ GearListModel::GearListModel(physis_SqPackResource *data, QObject *parent) m_sheet = physis_sqpack_read_excel_sheet(data, "Item", &m_exh, Language::English); for (unsigned int i = 0; i < m_sheet.page_count; i++) { - for (unsigned int j = m_exh.pages[i].start_id; j < m_exh.pages[i].start_id + m_sheet.pages[i].row_count; j++) { + for (unsigned int j = m_exh.pages[i].start_id; j < m_exh.pages[i].start_id + m_sheet.pages[i].entry_count; j++) { const auto row = physis_excel_get_row(&m_sheet, j); // TODO: use all rows, free - if (row.row_data) { - auto primaryModel = row.row_data[0].column_data[47].u_int64._0; + if (row.columns) { + auto primaryModel = row.columns[47].u_int64._0; // auto secondaryModel = row.column_data[48].u_int64._0; int16_t parts[4]; memcpy(parts, &primaryModel, sizeof(int16_t) * 4); - const auto slot = physis_slot_from_id(row.row_data[0].column_data[17].u_int8._0); + const auto slot = physis_slot_from_id(row.columns[17].u_int8._0); if (slot == Slot::Invalid) { continue; } GearInfo info = {}; - info.name = row.row_data[0].column_data[9].string._0; - info.icon = row.row_data[0].column_data[10].u_int16._0; + info.name = row.columns[9].string._0; + info.icon = row.columns[10].u_int16._0; info.slot = slot; info.modelInfo.primaryID = parts[0]; diff --git a/apps/mapeditor/src/appstate.cpp b/apps/mapeditor/src/appstate.cpp index 44b255f..10582a5 100644 --- a/apps/mapeditor/src/appstate.cpp +++ b/apps/mapeditor/src/appstate.cpp @@ -53,8 +53,8 @@ void AppState::clear() QString AppState::lookupENpcName(const uint32_t id) const { auto row = physis_excel_get_row(&m_enpcResidentSheet, id); - if (row.row_data && strlen(row.row_data[0].column_data[0].string._0) > 0) { - return QString::fromLatin1(row.row_data[0].column_data[0].string._0); + if (row.columns && strlen(row.columns[0].string._0) > 0) { + return QString::fromLatin1(row.columns[0].string._0); } return i18n("Event NPC"); } @@ -62,8 +62,8 @@ QString AppState::lookupENpcName(const uint32_t id) const QString AppState::lookupEObjName(const uint32_t id) const { auto row = physis_excel_get_row(&m_eobjNameSheet, id); - if (row.row_data && strlen(row.row_data[0].column_data[0].string._0) > 0) { - return QString::fromLatin1(row.row_data[0].column_data[0].string._0); + if (row.columns && strlen(row.columns[0].string._0) > 0) { + return QString::fromLatin1(row.columns[0].string._0); } return i18n("Event Object"); } diff --git a/apps/mapeditor/src/maplistwidget.cpp b/apps/mapeditor/src/maplistwidget.cpp index 91b614f..2edecd6 100644 --- a/apps/mapeditor/src/maplistwidget.cpp +++ b/apps/mapeditor/src/maplistwidget.cpp @@ -45,23 +45,23 @@ MapListWidget::MapListWidget(physis_SqPackResource *data, QWidget *parent) // TODO: figure out why row_count in EXH is wrong?! for (uint32_t i = 0; i < territoryExh.pages[0].row_count; i++) { auto territoryExdRow = physis_excel_get_row(&territorySheet, i); // TODO: free, use all rows - if (territoryExdRow.row_data) { - const char *bg = territoryExdRow.row_data[0].column_data[1].string._0; + if (territoryExdRow.columns) { + const char *bg = territoryExdRow.columns[1].string._0; if (strlen(bg) == 0) { continue; } - int placeRegionKey = territoryExdRow.row_data[0].column_data[3].u_int16._0; + int placeRegionKey = territoryExdRow.columns[3].u_int16._0; auto regionExdRow = physis_excel_get_row(&nameSheet, placeRegionKey); // TODO: free, use all rows - const char *placeRegion = regionExdRow.row_data[0].column_data[0].string._0; + const char *placeRegion = regionExdRow.columns[0].string._0; - int placeZoneKey = territoryExdRow.row_data[0].column_data[4].u_int16._0; + int placeZoneKey = territoryExdRow.columns[4].u_int16._0; auto zoneExdRow = physis_excel_get_row(&nameSheet, placeZoneKey); // TODO: free, use all rows - const char *placeZone = zoneExdRow.row_data[0].column_data[0].string._0; + const char *placeZone = zoneExdRow.columns[0].string._0; - int placeNameKey = territoryExdRow.row_data[0].column_data[5].u_int16._0; + int placeNameKey = territoryExdRow.columns[5].u_int16._0; auto nameExdRow = physis_excel_get_row(&nameSheet, placeNameKey); // TODO: free, use all rows - const char *placeName = nameExdRow.row_data[0].column_data[0].string._0; + const char *placeName = nameExdRow.columns[0].string._0; QStandardItem *item = new QStandardItem(); item->setData(QString::fromStdString(bg)); diff --git a/extern/libphysis b/extern/libphysis index 2f4bb68..1f3944b 160000 --- a/extern/libphysis +++ b/extern/libphysis @@ -1 +1 @@ -Subproject commit 2f4bb6843d7622fdd556126586163737271f8e84 +Subproject commit 1f3944b356913546d5cef34957e1f34002590a86 diff --git a/parts/exd/excelmodel.cpp b/parts/exd/excelmodel.cpp index a7fb889..ec756a3 100644 --- a/parts/exd/excelmodel.cpp +++ b/parts/exd/excelmodel.cpp @@ -20,21 +20,19 @@ ExcelModel::ExcelModel(const physis_EXH &exh, const physis_ExcelSheetPage &page, , m_language(language) { // We need to count the subrows to get the "true" row count. - unsigned int regularRowCount = 0; - for (unsigned int i = 0; i < page.row_count; i++) { - const auto &row = page.rows[i]; + for (unsigned int i = 0; i < page.entry_count; i++) { + const auto &entry = page.entries[i]; - for (unsigned int j = 0; j < row.row_count; j++) { + for (unsigned int j = 0; j < entry.subrow_count; j++) { // Push a "true" row index for the given subrow. This is just for faster lookups. - m_rowIndices.emplace_back(regularRowCount, row.row_id, j); + m_rowIndices.emplace_back(i, entry.row_id, j); } - if (row.row_count > 1) { + if (entry.subrow_count > 1) { m_hasSubrows = true; } - m_rowCount += row.row_count; - regularRowCount++; + m_rowCount += entry.subrow_count; } // TODO: make this look-up more sensible to reduce calls to indexOf @@ -124,28 +122,28 @@ QVariant ExcelModel::data(const QModelIndex &index, int role) const // TODO: de-duplicate with the identical switch below uint32_t targetRowId; switch (data.tag) { - case physis_ColumnData::Tag::Int8: + case physis_Field::Tag::Int8: targetRowId = data.int8._0; break; - case physis_ColumnData::Tag::UInt8: + case physis_Field::Tag::UInt8: targetRowId = data.u_int8._0; break; - case physis_ColumnData::Tag::Int16: + case physis_Field::Tag::Int16: targetRowId = data.int16._0; break; - case physis_ColumnData::Tag::UInt16: + case physis_Field::Tag::UInt16: targetRowId = data.u_int16._0; break; - case physis_ColumnData::Tag::Int32: + case physis_Field::Tag::Int32: targetRowId = data.int32._0; break; - case physis_ColumnData::Tag::UInt32: + case physis_Field::Tag::UInt32: targetRowId = data.u_int32._0; break; - case physis_ColumnData::Tag::Int64: + case physis_Field::Tag::Int64: targetRowId = data.int64._0; break; - case physis_ColumnData::Tag::UInt64: + case physis_Field::Tag::UInt64: targetRowId = data.u_int64._0; break; default: @@ -222,35 +220,35 @@ QHash ExcelModel::roleNames() const }; } -QVariant ExcelModel::displayForColumn(const uint32_t column, const physis_ColumnData &data) const +QVariant ExcelModel::displayForColumn(const uint32_t column, const physis_Field &data) const { // Check to see if there's any targets const auto targetSheets = m_schema.targetSheetsForColumn(column); if (!targetSheets.isEmpty()) { uint32_t targetRowId; switch (data.tag) { - case physis_ColumnData::Tag::Int8: + case physis_Field::Tag::Int8: targetRowId = data.int8._0; break; - case physis_ColumnData::Tag::UInt8: + case physis_Field::Tag::UInt8: targetRowId = data.u_int8._0; break; - case physis_ColumnData::Tag::Int16: + case physis_Field::Tag::Int16: targetRowId = data.int16._0; break; - case physis_ColumnData::Tag::UInt16: + case physis_Field::Tag::UInt16: targetRowId = data.u_int16._0; break; - case physis_ColumnData::Tag::Int32: + case physis_Field::Tag::Int32: targetRowId = data.int32._0; break; - case physis_ColumnData::Tag::UInt32: + case physis_Field::Tag::UInt32: targetRowId = data.u_int32._0; break; - case physis_ColumnData::Tag::Int64: + case physis_Field::Tag::Int64: targetRowId = data.int64._0; break; - case physis_ColumnData::Tag::UInt64: + case physis_Field::Tag::UInt64: targetRowId = data.u_int64._0; break; default: @@ -268,7 +266,7 @@ QVariant ExcelModel::displayForColumn(const uint32_t column, const physis_Column const Schema schema(schemaDir.absoluteFilePath(QStringLiteral("%1.yml").arg(sheetName))); if (const auto displayFieldIndex = schema.displayFieldIndex()) { - return displayForData(m_resolver->translateSchemaColumn(sheetName, &row.row_data[0], *displayFieldIndex)); + return displayForData(m_resolver->translateSchemaColumn(sheetName, &row, *displayFieldIndex)); } } } @@ -277,41 +275,41 @@ QVariant ExcelModel::displayForColumn(const uint32_t column, const physis_Column return displayForData(data); } -QVariant ExcelModel::displayForData(const physis_ColumnData &data) +QVariant ExcelModel::displayForData(const physis_Field &data) { QString columnString; switch (data.tag) { - case physis_ColumnData::Tag::String: + case physis_Field::Tag::String: columnString = QString::fromStdString(data.string._0); break; - case physis_ColumnData::Tag::Bool: + case physis_Field::Tag::Bool: columnString = data.bool_._0 ? i18nc("Value is true", "True") : i18nc("Value is false", "False"); break; - case physis_ColumnData::Tag::Int8: + case physis_Field::Tag::Int8: columnString = QString::number(data.int8._0); break; - case physis_ColumnData::Tag::UInt8: + case physis_Field::Tag::UInt8: columnString = QString::number(data.u_int8._0); break; - case physis_ColumnData::Tag::Int16: + case physis_Field::Tag::Int16: columnString = QString::number(data.int16._0); break; - case physis_ColumnData::Tag::UInt16: + case physis_Field::Tag::UInt16: columnString = QString::number(data.u_int16._0); break; - case physis_ColumnData::Tag::Int32: + case physis_Field::Tag::Int32: columnString = QString::number(data.int32._0); break; - case physis_ColumnData::Tag::UInt32: + case physis_Field::Tag::UInt32: columnString = QString::number(data.u_int32._0); break; - case physis_ColumnData::Tag::Float32: + case physis_Field::Tag::Float32: columnString = QString::number(data.float32._0); break; - case physis_ColumnData::Tag::Int64: + case physis_Field::Tag::Int64: columnString = QString::number(data.int64._0); break; - case physis_ColumnData::Tag::UInt64: + case physis_Field::Tag::UInt64: columnString = QString::number(data.u_int64._0); break; } @@ -319,13 +317,26 @@ QVariant ExcelModel::displayForData(const physis_ColumnData &data) return columnString; } -physis_ColumnData &ExcelModel::dataForIndex(const QModelIndex &index) const +physis_Field &ExcelModel::dataForIndex(const QModelIndex &index) const { - const auto [row_index, _, subrow_id] = m_rowIndices[index.row()]; - const auto &row = m_page.rows[row_index]; - const auto &subrow = row.row_data[subrow_id]; + const auto [row_index, _, subrow_index] = m_rowIndices[index.row()]; + if (row_index < m_page.entry_count) { + const auto &row = m_page.entries[row_index]; - return subrow.column_data[index.column()]; + if (subrow_index < row.subrow_count) { + const auto &subrow = row.subrows[subrow_index]; + + if (index.column() < static_cast(m_page.column_count)) { + return subrow.columns[index.column()]; + } + qFatal() << "Requesting column" << index.column() << "despite the column count being" << m_page.column_count; + Q_UNREACHABLE(); + } + qFatal() << "Requesting subrow of index" << subrow_index << "despite the subrow count for" << row.row_id << "being" << subrow_index; + Q_UNREACHABLE(); + } + qFatal() << "Requesting entry of index" << row_index << "despite the entry count being" << m_page.entry_count; + Q_UNREACHABLE(); } #include "moc_excelmodel.cpp" diff --git a/parts/exd/excelmodel.h b/parts/exd/excelmodel.h index deb7fd9..111988e 100644 --- a/parts/exd/excelmodel.h +++ b/parts/exd/excelmodel.h @@ -35,22 +35,22 @@ class ExcelModel : public QAbstractTableModel /** * @brief Returns a nice display for a given column data, including resolving other sheets.. */ - QVariant displayForColumn(uint32_t column, const physis_ColumnData &data) const; + QVariant displayForColumn(uint32_t column, const physis_Field &data) const; /** * @brief Returns a nice display for a given column data. */ - static QVariant displayForData(const physis_ColumnData &data); + static QVariant displayForData(const physis_Field &data); /** * @brief Returns the column data for a given QModelIndex. */ - physis_ColumnData &dataForIndex(const QModelIndex &index) const; + physis_Field &dataForIndex(const QModelIndex &index) const; physis_EXH m_exh; physis_ExcelSheetPage m_page; uint32_t m_rowCount = 0; - std::vector> m_rowIndices; + std::vector> m_rowIndices; Schema m_schema; // TODO: don't copy bool m_hasSubrows = false; // Mapping from a regular index to a list of columns that were sorted by offset diff --git a/parts/exd/excelresolver.cpp b/parts/exd/excelresolver.cpp index 45d83a8..d01d6ec 100644 --- a/parts/exd/excelresolver.cpp +++ b/parts/exd/excelresolver.cpp @@ -7,8 +7,7 @@ #include -std::optional> -AbstractExcelResolver::resolveRow(const QStringList &sheetNames, const uint32_t row, const Language language) +std::optional> AbstractExcelResolver::resolveRow(const QStringList &sheetNames, const uint32_t row, const Language language) { Q_UNUSED(sheetNames) Q_UNUSED(row) @@ -16,11 +15,11 @@ AbstractExcelResolver::resolveRow(const QStringList &sheetNames, const uint32_t return std::nullopt; } -physis_ColumnData &AbstractExcelResolver::translateSchemaColumn(const QString &sheetName, physis_ExcelRow const *row, uint32_t column) +physis_Field &AbstractExcelResolver::translateSchemaColumn(const QString &sheetName, physis_ExcelRow const *row, uint32_t column) { Q_UNUSED(sheetName) Q_UNUSED(column) - return row->column_data[0]; + return row->columns[0]; } CachingExcelResolver::CachingExcelResolver(physis_SqPackResource *resource) @@ -28,7 +27,7 @@ CachingExcelResolver::CachingExcelResolver(physis_SqPackResource *resource) { } -std::optional> CachingExcelResolver::resolveRow(const QStringList &sheetNames, const uint32_t row, const Language language) +std::optional> CachingExcelResolver::resolveRow(const QStringList &sheetNames, const uint32_t row, const Language language) { for (const auto &sheetName : sheetNames) { const auto exh = getCachedEXH(sheetName); @@ -51,7 +50,7 @@ std::optional> CachingExcelResolver::resolv return AbstractExcelResolver::resolveRow(sheetNames, row, language); } -physis_ColumnData &CachingExcelResolver::translateSchemaColumn(const QString &sheetName, physis_ExcelRow const *row, const uint32_t column) +physis_Field &CachingExcelResolver::translateSchemaColumn(const QString &sheetName, physis_ExcelRow const *row, const uint32_t column) { const auto exh = getCachedEXH(sheetName); Q_ASSERT(exh.p_ptr); @@ -70,7 +69,7 @@ physis_ColumnData &CachingExcelResolver::translateSchemaColumn(const QString &sh sortedColumnIndices.push_back(sortedColumns[i].second); } - return row->column_data[sortedColumnIndices[column]]; + return row->columns[sortedColumnIndices[column]]; } physis_EXH &CachingExcelResolver::getCachedEXH(const QString &sheetName) diff --git a/parts/exd/excelresolver.h b/parts/exd/excelresolver.h index 83eaeb5..d61549e 100644 --- a/parts/exd/excelresolver.h +++ b/parts/exd/excelresolver.h @@ -25,9 +25,9 @@ class AbstractExcelResolver * * The first sheet that contains said row ID will be returned. */ - virtual std::optional> resolveRow(const QStringList &sheetNames, uint32_t row, Language language); + virtual std::optional> resolveRow(const QStringList &sheetNames, uint32_t row, Language language); - virtual physis_ColumnData &translateSchemaColumn(const QString &sheetName, physis_ExcelRow const *row, uint32_t column); + virtual physis_Field &translateSchemaColumn(const QString &sheetName, physis_ExcelRow const *row, uint32_t column); }; struct EXDSelector { @@ -50,9 +50,9 @@ class CachingExcelResolver : public AbstractExcelResolver public: explicit CachingExcelResolver(physis_SqPackResource *resource); - std::optional> resolveRow(const QStringList &sheetNames, uint32_t row, Language language) override; + std::optional> resolveRow(const QStringList &sheetNames, uint32_t row, Language language) override; - physis_ColumnData &translateSchemaColumn(const QString &sheetName, physis_ExcelRow const *row, uint32_t column) override; + physis_Field &translateSchemaColumn(const QString &sheetName, physis_ExcelRow const *row, uint32_t column) override; private: /**