Wow the ROM Header was just completely busted. Game list view works now

This commit is contained in:
2026-06-11 22:58:00 +02:00
parent bad1691ee2
commit fc306967f9
6 changed files with 192 additions and 115 deletions
+92 -7
View File
@@ -21,7 +21,7 @@ void KaizenGui::populateRomsList(const std::string &romsPath) {
if (!file.is_regular_file())
continue;
auto filename = file.path().lexically_normal().string();
auto filename = file.path().string();
bool isPlain = std::ranges::any_of(std::array{".n64", ".z64", ".v64"},
[&](const std::string &ext) { return file.path().extension() == ext; });
@@ -36,9 +36,18 @@ void KaizenGui::populateRomsList(const std::string &romsPath) {
auto rom = n64::Mem::LoadROM(isArchive, filename);
auto regions = n64::GameDB::match(rom);
if (rom.gameNameDB.empty())
rom.gameNameDB = fs::path(filename).stem();
romsListPaths.push_back(filename);
romsList->insertRow(i);
romsList->setItem(i, 0, new QTableWidgetItem(core.mem->rom.gameNameDB.c_str()));
romsList->setItem(
i, 0,
new QTableWidgetItem(std::format("{} ({}) (Rev {})", rom.gameNameDB,
n64::GameDB::regionCodeToReadable(rom.header.countryCode),
rom.header.version)
.c_str()));
romsList->setItem(i, 1, new QTableWidgetItem(regions.c_str()));
romsList->setItem(i, 2, new QTableWidgetItem("Never"));
romsList->setItem(i, 3, new QTableWidgetItem("0h 0m 0s"));
@@ -51,6 +60,7 @@ void KaizenGui::populateRomsList(const std::string &romsPath) {
KaizenGui::KaizenGui() noexcept : QMainWindow(nullptr), settings(QSettings::UserScope) {
SDL_InitSubSystem(SDL_INIT_GAMEPAD);
SDL_AddGamepadMapping(gamecontrollerdb_str);
hide();
romsList->verticalHeader()->hide();
@@ -60,10 +70,10 @@ KaizenGui::KaizenGui() noexcept : QMainWindow(nullptr), settings(QSettings::User
romsList->setEditTriggers(QAbstractItemView::NoEditTriggers);
romsList->setSortingEnabled(true);
romsList->setColumnCount(4);
romsList->setHorizontalHeaderItem(0, romName);
romsList->setHorizontalHeaderItem(1, romRegions);
romsList->setHorizontalHeaderItem(2, romLastPlayed);
romsList->setHorizontalHeaderItem(3, romTimePlayed);
romsList->setHorizontalHeaderItem(0, new QTableWidgetItem("Name"));
romsList->setHorizontalHeaderItem(1, new QTableWidgetItem("Regions"));
romsList->setHorizontalHeaderItem(2, new QTableWidgetItem("Last played"));
romsList->setHorizontalHeaderItem(3, new QTableWidgetItem("Time played"));
vulkanWidget = new RenderWidget();
vulkanWidget->hide();
@@ -105,9 +115,36 @@ KaizenGui::KaizenGui() noexcept : QMainWindow(nullptr), settings(QSettings::User
setAcceptDrops(true);
SDLeventsTimer = new QTimer();
SDLeventsTimer->setInterval(1);
statusBarTimer = new QTimer();
statusBarTimer->setInterval(500);
connect(SDLeventsTimer, &QTimer::timeout, this, [&] {
SDL_Event e;
while (SDL_PollEvent(&e)) {
if (e.type == SDL_EVENT_GAMEPAD_ADDED) {
if (!gamepad) {
const auto index = e.gdevice.which;
gamepad = SDL_OpenGamepad(index);
warn("Found controller!");
warn("Name: {}", SDL_GetGamepadName(gamepad));
warn("Vendor: {}", SDL_GetGamepadVendor(gamepad));
}
}
if (e.type == SDL_EVENT_GAMEPAD_REMOVED) {
if (gamepad) {
SDL_CloseGamepad(gamepad);
gamepad = nullptr;
}
}
}
});
SDLeventsTimer->start();
connect(statusBarTimer, &QTimer::timeout, this, [&] {
pause->setText("Pause");
fpsLabel->setText(std::format("FPS: {:.2f}", 1000.f / elapsed).c_str());
@@ -234,6 +271,28 @@ KaizenGui::~KaizenGui() { cleanup(); }
void KaizenGui::updateKeys() {
auto &pif = core.mem->mmio.si.pif;
if (gamepad) {
pif.UpdateButton(0, n64::Controller::Z,
SDL_GetGamepadAxis(gamepad, SDL_GAMEPAD_AXIS_LEFT_TRIGGER) == SDL_JOYSTICK_AXIS_MAX);
pif.UpdateButton(0, n64::Controller::A, SDL_GetGamepadButton(gamepad, SDL_GAMEPAD_BUTTON_SOUTH));
pif.UpdateButton(0, n64::Controller::B, SDL_GetGamepadButton(gamepad, SDL_GAMEPAD_BUTTON_WEST));
pif.UpdateButton(0, n64::Controller::LT, SDL_GetGamepadButton(gamepad, SDL_GAMEPAD_BUTTON_LEFT_SHOULDER));
pif.UpdateButton(0, n64::Controller::RT, SDL_GetGamepadButton(gamepad, SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER));
pif.UpdateButton(0, n64::Controller::Start, SDL_GetGamepadButton(gamepad, SDL_GAMEPAD_BUTTON_START));
pif.UpdateButton(0, n64::Controller::DUp, SDL_GetGamepadButton(gamepad, SDL_GAMEPAD_BUTTON_DPAD_UP));
pif.UpdateButton(0, n64::Controller::DDown, SDL_GetGamepadButton(gamepad, SDL_GAMEPAD_BUTTON_DPAD_DOWN));
pif.UpdateButton(0, n64::Controller::DLeft, SDL_GetGamepadButton(gamepad, SDL_GAMEPAD_BUTTON_DPAD_LEFT));
pif.UpdateButton(0, n64::Controller::DRight, SDL_GetGamepadButton(gamepad, SDL_GAMEPAD_BUTTON_DPAD_RIGHT));
pif.UpdateButton(0, n64::Controller::CUp,
SDL_GetGamepadAxis(gamepad, SDL_GAMEPAD_AXIS_RIGHTY) == SDL_JOYSTICK_AXIS_MIN);
pif.UpdateButton(0, n64::Controller::CDown,
SDL_GetGamepadAxis(gamepad, SDL_GAMEPAD_AXIS_RIGHTY) == SDL_JOYSTICK_AXIS_MAX);
pif.UpdateButton(0, n64::Controller::CLeft,
SDL_GetGamepadAxis(gamepad, SDL_GAMEPAD_AXIS_RIGHTX) == SDL_JOYSTICK_AXIS_MIN);
pif.UpdateButton(0, n64::Controller::CRight,
SDL_GetGamepadAxis(gamepad, SDL_GAMEPAD_AXIS_RIGHTX) == SDL_JOYSTICK_AXIS_MAX);
return;
}
pif.UpdateButton(0, n64::Controller::Z, pressedKeys.test(0));
pif.UpdateButton(0, n64::Controller::A, pressedKeys.test(1));
pif.UpdateButton(0, n64::Controller::B, pressedKeys.test(2));
@@ -251,8 +310,34 @@ void KaizenGui::updateKeys() {
}
void KaizenGui::updateAxis() {
s16 x = 0, y = 0;
auto &pif = core.mem->mmio.si.pif;
if (gamepad) {
float xclamped = SDL_GetGamepadAxis(gamepad, SDL_GAMEPAD_AXIS_LEFTX);
if (xclamped < 0) {
xclamped /= static_cast<float>(std::abs(SDL_JOYSTICK_AXIS_MAX));
} else {
xclamped /= SDL_JOYSTICK_AXIS_MAX;
}
xclamped *= 86;
float yclamped = SDL_GetGamepadAxis(gamepad, SDL_GAMEPAD_AXIS_LEFTY);
if (yclamped < 0) {
yclamped /= static_cast<float>(std::abs(SDL_JOYSTICK_AXIS_MIN));
} else {
yclamped /= SDL_JOYSTICK_AXIS_MAX;
}
yclamped *= 86;
pif.UpdateAxis(0, n64::Controller::Axis::Y, static_cast<s8>(-yclamped));
pif.UpdateAxis(0, n64::Controller::Axis::X, static_cast<s8>(xclamped));
return;
}
s16 x = 0, y = 0;
if (pressedKeys.test(14)) // up
y += 86;