mirror of
https://github.com/LNH-team/pico-launcher.git
synced 2026-06-02 09:06:54 +02:00
Initial work on implementing support for cheats
This commit is contained in:
66
arm9/source/romBrowser/viewModels/CheatsViewModel.cpp
Normal file
66
arm9/source/romBrowser/viewModels/CheatsViewModel.cpp
Normal file
@@ -0,0 +1,66 @@
|
||||
#include "common.h"
|
||||
#include "cheats/ICheatRepository.h"
|
||||
#include "fat/File.h"
|
||||
#include "CheatsViewModel.h"
|
||||
|
||||
#define CRCPOLY 0xEDB88320
|
||||
|
||||
static u32 crc32(const void* buffer, u32 length)
|
||||
{
|
||||
u32 crc = ~0u;
|
||||
const u8* p = (u8*)buffer;
|
||||
while (length--)
|
||||
{
|
||||
crc ^= *p++;
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
crc = (crc >> 1) ^ ((crc & 1) ? CRCPOLY : 0);
|
||||
}
|
||||
}
|
||||
|
||||
return crc;
|
||||
}
|
||||
|
||||
CheatsViewModel::CheatsViewModel(const FileInfo& romFileInfo, IRomBrowserController* romBrowserController)
|
||||
: _romFileInfo(romFileInfo), _romBrowserController(romBrowserController)
|
||||
{
|
||||
_loadCheatsTask = _romBrowserController->GetIoTaskQueue()->Enqueue([this] (const vu8& cancelRequested)
|
||||
{
|
||||
LOG_DEBUG("%s\n", _romFileInfo.GetFileName());
|
||||
auto file = std::make_unique<File>();
|
||||
file->Open(_romFileInfo.GetFastFileRef(), FA_READ);
|
||||
auto headerBuffer = std::make_unique_for_overwrite<u8[]>(512);
|
||||
if (!file->ReadExact(headerBuffer.get(), 512))
|
||||
{
|
||||
LOG_ERROR("Could not read rom header\n");
|
||||
return TaskResult<void>::Failed();
|
||||
}
|
||||
file->Close();
|
||||
|
||||
if (cancelRequested)
|
||||
{
|
||||
return TaskResult<void>::Canceled();
|
||||
}
|
||||
|
||||
u32 gameCode = *(u32*)(headerBuffer.get() + 0xC);
|
||||
u32 crc = crc32(headerBuffer.get(), 512);
|
||||
headerBuffer.reset();
|
||||
|
||||
if (cancelRequested)
|
||||
{
|
||||
return TaskResult<void>::Canceled();
|
||||
}
|
||||
|
||||
_cheats = _romBrowserController->GetCheatRepository().GetCheatsForGame(gameCode, crc);
|
||||
if (_cheats)
|
||||
{
|
||||
_state = State::DisplayCheats;
|
||||
}
|
||||
else
|
||||
{
|
||||
_state = State::NoCheats;
|
||||
}
|
||||
|
||||
return TaskResult<void>::Completed();
|
||||
});
|
||||
}
|
||||
35
arm9/source/romBrowser/viewModels/CheatsViewModel.h
Normal file
35
arm9/source/romBrowser/viewModels/CheatsViewModel.h
Normal file
@@ -0,0 +1,35 @@
|
||||
#pragma once
|
||||
#include <memory>
|
||||
#include "core/task/TaskQueue.h"
|
||||
#include "cheats/GameCheats.h"
|
||||
#include "romBrowser/FileInfo.h"
|
||||
#include "romBrowser/IRomBrowserController.h"
|
||||
|
||||
/// @brief View model for the cheats screen.
|
||||
class CheatsViewModel
|
||||
{
|
||||
public:
|
||||
enum class State
|
||||
{
|
||||
Loading,
|
||||
NoCheats,
|
||||
DisplayCheats
|
||||
};
|
||||
|
||||
CheatsViewModel(const FileInfo& romFileInfo, IRomBrowserController* romBrowserController);
|
||||
|
||||
void Close()
|
||||
{
|
||||
_romBrowserController->HideGameInfo();
|
||||
}
|
||||
|
||||
State GetState() const { return _state; }
|
||||
const GameCheats* GetCheats() const { return _cheats.get(); }
|
||||
|
||||
private:
|
||||
FileInfo _romFileInfo;
|
||||
IRomBrowserController* _romBrowserController;
|
||||
QueueTask<void> _loadCheatsTask;
|
||||
std::unique_ptr<GameCheats> _cheats;
|
||||
State _state = State::Loading;
|
||||
};
|
||||
@@ -1,5 +1,6 @@
|
||||
#include "common.h"
|
||||
#include <algorithm>
|
||||
#include "romBrowser/FileType/Nds/NdsFileType.h"
|
||||
#include "RomBrowserViewModel.h"
|
||||
|
||||
RomBrowserViewModel::RomBrowserViewModel(IRomBrowserController* romBrowserController, const char* initialSelectedFileName)
|
||||
@@ -34,7 +35,8 @@ RomBrowserViewModel::RomBrowserViewModel(IRomBrowserController* romBrowserContro
|
||||
auto sortedFilteredFiles = sdFolder.FilterAndSort(filterSortParams, filteredCount);
|
||||
u64 endTick = gTickCounter.GetValue();
|
||||
LOG_DEBUG("Filter + sort took: %d us\n", (u32)TickCounter::TicksToMicroSeconds(endTick - startTick));
|
||||
_fileInfoManager = std::make_unique<FileInfoManager>(std::move(sortedFilteredFiles), filteredCount, _romBrowserController->GetCoverRepository());
|
||||
_fileInfoManager = std::make_unique<FileInfoManager>(std::move(sortedFilteredFiles),
|
||||
filteredCount, _romBrowserController->GetCoverRepository());
|
||||
_selectedItem = _fileInfoManager->GetItemIndex(initialSelectedFileName);
|
||||
}
|
||||
|
||||
@@ -59,7 +61,8 @@ void RomBrowserViewModel::NavigateUp()
|
||||
void RomBrowserViewModel::ShowGameInfo()
|
||||
{
|
||||
const auto& item = _fileInfoManager->GetItem(_selectedItem);
|
||||
if (item.GetFileType()->GetClassification() == FileTypeClassification::Folder)
|
||||
return;
|
||||
_romBrowserController->ShowGameInfo();
|
||||
if (item.GetFileType() == &NdsFileType::sInstance)
|
||||
{
|
||||
_romBrowserController->ShowGameInfo(item);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user